【问题标题】:What is the Dockerfile "right approach" for production?Dockerfile 的生产“正确方法”是什么?
【发布时间】:2019-09-02 19:14:32
【问题描述】:

码头工人之前: 我曾经构建发布位并对其进行一组测试。这些位已从单元测试到 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"]

【问题讨论】:

  • 你不应该在 docker 容器内构建。而是在 cicd(例如 jenkins)中构建工件(.jar.dll)并在容器内使用工件。
  • 这就是我要找的东西,但我不知道该怎么做。任何帮助,将不胜感激。我现在正在为 cicd 使用 Azure DevOps。

标签: docker kubernetes .net-core docker-compose dockerfile


【解决方案1】:

首先,我们的构建系统应该是确定性的——如果不是,那你就有问题了。 至于您的 Dockerfile:显示的文件实际上是三个图像 - 第一个构建代码,第二个发布它,最后一个仅执行它。

一个好的管道通常是这样的:

Build AND Unittest - 如果单元测试失败,则中止构建。 如果单元测试是绿色的,请将生成的图像发布到您选择的 docker 注册表。

在开发环境中使用该图像,例如一个 Kubernetes 集群、Azure 容器实例等。现在运行您需要的任何 E2E、IT 测试等。只有且仅当您的所有测试都返回绿色时,才能将映像提升到生产环境,例如将它们从开发转移到生产。根据解决方案的不同,您的开发环境看起来可能完全不同 - 如果您要部署一个服务,请直接运行 e2e 测试,但也许您需要设置一个复杂的集群,所以在这样的测试上运行测试集群。

由于 docker 的性质,映像无法更改,因此您可以安全地将映像从开发版升级到生产版。但是您需要确保永远不会覆盖注册表中的图像,例如避免使用最新标签并使用显式标签甚至​​ sha256 标签。

【讨论】:

    【解决方案2】:

    我遵循的一般做法是:

    第一阶段:

    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

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      相关资源
      最近更新 更多