Docker: 构建完成后如何使用多阶段图像

Docker: How to use multistage images after build finishes

场景

考虑到这些,我想建立关注

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

基础阶段的再利用

这是对 运行

的要求
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 实际上将被在命令行。为了更深入地了解 CMDENTRYPOINT 指令的语义,我建议阅读 that section of the Dockerfile reference.

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