【问题标题】:How do I copy variables between stages of multi stage Docker build?如何在多阶段 Docker 构建的阶段之间复制变量?
【发布时间】:2019-03-25 01:58:48
【问题描述】:

我只看到了使用 COPY 在多阶段 Dockerfile 的阶段之间复制文件的示例,但是有没有办法简单地复制 ENV 变量?我的用例是从一个 git 图像开始,以获取将成为构建一部分的提交哈希。我稍后构建的图像没有 git。

我意识到我可以将 git 哈希输出到文件并使用 COPY,但我只是想知道是否有更清洁的方法?

【问题讨论】:

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


    【解决方案1】:

    您有 3 个选项: “ARG”解决方案、“基础”解决方案和“文件”解决方案。

    ARG version_default=v1
    
    FROM alpine:latest as base1
    ARG version_default
    ENV version=$version_default
    RUN echo ${version}
    RUN echo ${version_default}
    
    FROM alpine:latest as base2
    ARG version_default
    RUN echo ${version_default}
    

    另一种方法是将基础容器用于多个阶段:

    FROM alpine:latest as base
    ARG version_default
    ENV version=$version_default
    
    FROM base
    RUN echo ${version}
    
    FROM base
    RUN echo ${version}
    

    您可以在此处找到更多详细信息: https://github.com/moby/moby/issues/37345

    您也可以在第一阶段将哈希保存到文件中,并在第二阶段复制该文件,然后在其中读取并使用它。

    【讨论】:

    • 请注意,如果您使用“基础容器”路线,如果您在第一阶段的层中公开任何凭据,它们将显示在最终图像中,这几乎肯定不是您想要的.
    【解决方案2】:

    在 Dockerfile 中的阶段之间共享变量:

    1. 在第一阶段将变量/ENV 保存到文件中: echo $runDeps > $DESTDIR/runtime.deps
    2. 将文件从第一阶段复制到第二阶段: $DESTDIR/runtime.deps
    3. 在第二阶段从文件中恢复值: RUN apk add --no-cache --virtual .run-deps `cat /runtime.deps` gnutls-utils iptables libnl3 readline gettext libintl

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-14
      • 2019-04-16
      • 2018-04-20
      • 1970-01-01
      • 2019-10-10
      • 2021-12-16
      • 2020-07-13
      • 2022-11-25
      相关资源
      最近更新 更多