6

设想

  • 多阶段构建将多个 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

基础阶段的重用

  • 我不想在中间阶段运行测试,而是在镜像之外运行它们,以便我可以重新排序测试序列并在管道层添加更多开关(Jenkins CI、Travis 等)
  • 我希望能够使用构建的基本映像。
  • 正如测试阶段所建议的那样,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

问题

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

1 回答 1

9

正如文档的这个页面中所解释的,您可以使用--target选项docker build来创建与构建的中间阶段相对应的图像。

使用 your 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您的build阶段的最后一条指令实际上将被命令行中给出的所有参数覆盖。为了更深入地了解语义CMD和指令,我建议ENTRYPOINT阅读.Dockerfile reference

此外,您可能希望使用--rm选项来docker run在创建的容器退出时自动删除它们。

于 2018-04-15T16:24:09.383 回答