【问题标题】:Use multi-stage docker files for outputting multiple images使用多阶段 docker 文件输出多个图像
【发布时间】:2018-02-28 11:06:27
【问题描述】:

一个新的 docker 功能是在 dockerfile 中做这样的事情

FROM php7-fpm as build
...

FROM build AS test
...

FROM test AS staging
...

据我所知,最后一个 FROM 语句标记了最终输出图像。怎么可能从一个中间图像中得到两个最终图像?

喜欢

...
FROM build AS test
...
FROM test AS staging
...
FROM test AS prod

不应丢弃测试、暂存和产品。我想将它们签入到存储库中。

【问题讨论】:

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


    【解决方案1】:

    您可以在某个阶段停止构建并根据需要标记它们。

    docker build --target test -t starx/test:latest .
    docker build --target staging -t starx/staging:latest .
    docker build --target prod -t starx/prod:latest .
    

    这样,您就有不同的图像,并且可以单独推送每个图像。

    【讨论】:

    • 好的,但是 docker-compose 根本不可能做到这一点?我的意思是,我不能为测试、产品、开发等编写 docker-compose.yml,执行此构建步骤?所以我想让我的 CI 用 docker build 等手动做 dings ...
    • 哦……我想我明白了……因为 docker-compose 3.4 可以设置目标阶段……这就是我需要的!谢谢
    • 虽然这行得通,但我不会使用它为不同的环境构建不同的图像。这违反了build once, deploy anywheredev-prod-parity 的原则。一个更有效的用例包括在不同的基础发行版上提供应用程序 (starks:alpine / starks:stretch)
    • @fab 在我看来,使用另一个基础镜像与在我的 docker 文件中安装单个包基本相同。基础图像在软件中也可能有所不同,因此在哪里完成没有区别。按照您的声明,您将(例如)有一个没有安装调试工具的开发环境,或者您有一个安装了调试工具的产品映像。这两种情况在实际用例中都不可用。我认为,尽可能均衡不同阶段是一个好方法,但并不适用于每一个已安装的软件......
    • 这是调试不带调试器实例的语言时的重要场景。例如,在 Golang 中,您需要 Delve 调试器和映像中的源代码才能从 docker 容器中对其进行调试……我不会在同一个生产映像中提供调试器,但我当然总是可以从用于 2 个不同目的的相同源代码,用 2 个不同的标签保存 :) 如果需要,我可以使用调试标签和宾果游戏切换部署,我在不同的图像上进行来自同一源的预生产。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多