Docker: 构建完成后如何使用多阶段图像
Docker: How to use multistage images after build finishes
场景
- 多阶段构建将多个 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
问题
- 目前支持吗?
- 有解决办法吗?
如 this page of the doc 中所述,您可以使用 docker build
的 --target
选项创建与构建的中间阶段相对应的映像。
使用您的 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
程序名称,因为 build
阶段的最后一条指令 CMD test
实际上将被在命令行。为了更深入地了解 CMD
和 ENTRYPOINT
指令的语义,我建议阅读 that section of the Dockerfile reference
.
此外,您可能希望使用 docker run
的 --rm
选项,以便在创建的容器退出时自动删除它们。
场景
- 多阶段构建将多个 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
问题
- 目前支持吗?
- 有解决办法吗?
如 this page of the doc 中所述,您可以使用 docker build
的 --target
选项创建与构建的中间阶段相对应的映像。
使用您的 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
程序名称,因为 build
阶段的最后一条指令 CMD test
实际上将被在命令行。为了更深入地了解 CMD
和 ENTRYPOINT
指令的语义,我建议阅读 that section of the Dockerfile reference
.
此外,您可能希望使用 docker run
的 --rm
选项,以便在创建的容器退出时自动删除它们。