docker - Dockerfile 的生产“正确方法”是什么?
问题描述
在 docker 之前: 我曾经构建 Release 位并在它们上运行一组测试。这些位已从单元测试到 Comp、Functional、E2E 等进行了测试。
使用 docker: 1)我有一个 CI 管道来测试位,但是...... 2)我使用 Docker 文件构建并同时将位推送到图像上。因此,考虑到非确定性构建系统,这是有风险的。我有什么办法可以编写 Dockerfile 来解决这个问题,或者你的方法是什么?
我用作示例的 .net 核心的 Dockerfile:
COPY . .
COPY /service /src/service
RUN dotnet build "src/service/ConsoleApp1/ConsoleApp1.csproj" -c release -o /app
FROM build AS publish
RUN dotnet publish "src/service/ConsoleApp1/ConsoleApp1.csproj" -c release -o /app
WORKDIR /app
FROM runtime AS final
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ConsoleApp1.dll"]
解决方案
我遵循的一般做法是:
第一阶段:
- 一旦功能分支合并到 master,在 CICD 中运行测试(例如 Jenkins)
- 一旦测试成功,构建版本化的工件,例如。(
.JAR
对于 java,.DLL
对于 dotnet) - 如果需要,将版本化的工件发布到工件(例如 Jfrog 或 nexus)
- 创建一个
git tag
第二阶段:
- 使用上面创建的版本化工件并创建仅复制工件的版本化容器映像。如果您还没有工件,您可以简单地复制本地工件。
例如。(警告:未经测试)
FROM microsoft/dotnet:latest
RUN mkdir -p /usr/local/app
COPY your-service/artifact-location/artifact-name.dll /usr/local/app
ENTRYPOINT ["dotnet", "/usr/local/app/ConsoleApp1.dll"]
- 标记版本化的容器镜像并推送到容器注册表(例如,来自 Amazon 的弹性容器注册表(ecr))
第三阶段:
- 使用新版本的容器镜像更新 Kubernetes 部署清单。
- 应用 Kubernetes 部署清单
如果有帮助,这里是 java 的示例 - https://github.com/prayagupd/eccount-rest/blob/master/Dockerfile和 Jenkins 的 CICD 管道 - https://github.com/prayagupd/eccount-rest/blob /master/Jenkinsfile
推荐阅读
- angular - 如何使用 Angular 更改对象值
- node.js - Nestjs passport-facebook 无效的 OAuth 访问令牌
- java - 稍后如何在这里初始化final?
- flutter - 使用返回小部件的功能在按钮单击时添加新小部件
- mysql - 如何将表列转换为mysql中的表?
- asp.net - 使用 asp.net core 和 react js 刷新时项目为空白
- javascript - 只接受 CSV 表单字段中的一些变量,而不接受 Django 中的所有变量?
- git - 在 GIT 中获取远程上游
- python - Pygame中的多人跟随相机
- rxjs - 仅当表单控件的先前值!==表单控件的当前值时,角度订阅才会更改