首页 > 解决方案 > 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"]

标签: dockerkubernetes.net-coredocker-composedockerfile

解决方案


我遵循的一般做法是:

第一阶段:

  1. 一旦功能分支合并到 master,在 CICD 中运行测试(例如 Jenkins)
  2. 一旦测试成功,构建版本化的工件,例如。(.JAR对于 java,.DLL对于 dotnet)
  3. 如果需要,将版本化的工件发布到工件(例如 Jfrog 或 nexus)
  4. 创建一个git tag

第二阶段:

  1. 使用上面创建的版本化工件并创建仅复制工件的版本化容器映像。如果您还没有工件,您可以简单地复制本地工件。

例如。(警告:未经测试)

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"]
  1. 标记版本化的容器镜像并推送到容器注册表(例如,来自 Amazon 的弹性容器注册表(ecr))

第三阶段:

  1. 使用新版本的容器镜像更新 Kubernetes 部署清单。
  2. 应用 Kubernetes 部署清单

如果有帮助,这里是 java 的示例 - https://github.com/prayagupd/eccount-rest/blob/master/Dockerfile和 Jenkins 的 CICD 管道 - https://github.com/prayagupd/eccount-rest/blob /master/Jenkinsfile


推荐阅读