Dockerfile的生产“正确方法”是什么?

时间:2019-09-02 19:14:32

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

在Docker之前: 我曾经构建Release版本并对其进行一组测试。这些位已通过单元测试进行了测试,包括Comp,Functional,E2E等。

使用docker: 1)我有一个CI管道来测试这些位,但是... 2)使用Docker文件,我同时构建并推送图像上的位。因此,考虑非确定性构建系统是有风险的。我可以通过任何方式编写Dockerfile来解决此问题,还是您采用什么方法?

我用作示例的.net核心的Dockerfile:

re.findall

2 个答案:

答案 0 :(得分:2)

我遵循的一般做法是:

第一阶段:

  1. 一旦功能分支合并到母版,即可在CICD(例如Jenkins)中运行测试
  2. 一旦测试成功,构建版本化的工件,例如。 (对于Java,.JAR,对于dotnet,.DLL
  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

答案 1 :(得分:1)

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

一个好的管道通常看起来像这样:

构建和单元测试-如果单元测试失败,则中止构建。 如果单元测试为绿色,则将生成的映像发布到您选择的Docker注册表。

在开发环境中使用该图像,例如pp。现在运行您需要的任何E2E,IT测试等。仅且仅当您的所有测试都恢复为绿色时,才能将图像推广到生产环境,例如将它们从开发人员转移到生产人员。根据解决方案的不同,您的开发环境可能看起来完全不同-如果您要部署单个服务,请直接运行e2e测试,但是也许您需要设置一个复杂的集群,因此请在这样的测试上运行测试集群。

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