如何在多阶段Docker构建的各个阶段之间复制变量?

时间:2018-10-20 10:50:42

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

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

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

2 个答案:

答案 0 :(得分:0)

您有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

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

答案 1 :(得分:0)

在 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