在Docker之前: 我曾经构建Release版本并对其进行一组测试。这些位已通过单元测试进行了测试,包括Comp,Functional,E2E等。
使用docker: 1)我有一个CI管道来测试这些位,但是... 2)使用Docker文件,我同时构建并推送图像上的位。因此,考虑非确定性构建系统是有风险的。我可以通过任何方式编写Dockerfile来解决此问题,还是您采用什么方法?
我用作示例的.net核心的Dockerfile:
re.findall
答案 0 :(得分:2)
我遵循的一般做法是:
第一阶段:
.JAR
,对于dotnet,.DLL
)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"]
第三阶段:
如果有帮助,这里是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标签。