【问题标题】:Docker: How to use multistage images after build finishesDocker:构建完成后如何使用多阶段映像
【发布时间】:2018-09-25 09:51:28
【问题描述】:

场景

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

问题

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

【问题讨论】:

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


    【解决方案1】:

    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 选项,以便在创建的容器退出时自动删除它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-23
      • 2021-11-06
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2020-06-05
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多