Docker:如何在构建完成后使用多级图像

时间:2018-04-15 16:10:46

标签: docker docker-build docker-multi-stage-build

方案

  • 多级构建将多个Dockerfile部分合并为一个
  • 中级和最后阶段可以复制上层文件
  • 建议最后阶段只需要二进制文件。

考虑到这些,我想构建以下

FROM fat-base as build
RUN setup unit test frameworks
RUN setup integration test frameworks
RUN setup functional test frameworks
RUN setup all heavy lifting stuff
CMD test

FROM slim-base
COPY --from=build /runtime/binary /bin/binary
ENTRYPOINT /bin/binary

重用基础阶段

  • 我不想在中间阶段运行测试,而是想在图像外部运行它们,以便我可以重新排序测试序列并在Pipeline层添加更多开关(Jenkins CI,Travis等)< / LI>
  • 我希望能够使用构建的基本图像。
  • 根据测试阶段的建议,可以使用辅助Dockerfile.test。但是,我想维护一个包含所有阶段的Dockerfile。

这是运行

的要求
docker build -t my-binary .
docker run -ti my-binary[0] unit
docker run -ti my-binary[0] integration --all
docker run -ti my-binary[0] functional --only-label=container

问题

  • 目前是否支持?
  • 有解决方法吗?

1 个答案:

答案 0 :(得分:3)

正如this page of the doc中所述,您可以使用--target的{​​{1}}选项来创建与构建的中间阶段相对应的图像。

使用docker build,这相当于以下命令:

Dockerfile

请注意,我在前面的最后三个命令中添加了docker build --target build -t my-binary-test . docker build -t my-binary . docker run -ti my-binary-test # run "test" as specified by "CMD test" docker run -ti my-binary-test test unit docker run -ti my-binary-test test integration --all docker run -ti my-binary-test test functional --only-label=container 程序名称,因为test阶段的最后一条指令CMD test实际上将被命令行中给出的所有参数覆盖。为了更好地了解buildCMD指令的语义,我建议您阅读that section of the Dockerfile reference

此外,您可能希望使用ENTRYPOINT的{​​{1}}选项,以便在退出时自动删除已创建的容器。