如何在多阶段 Docker 构建的阶段之间复制变量?
How do I copy variables between stages of multi stage Docker build?
我只看到了使用 COPY 在多阶段 Dockerfile 的阶段之间复制文件的示例,但是有没有一种方法可以简单地复制 ENV 变量?我的用例是从 git 图像开始,只是为了获取将成为构建一部分的提交哈希。我稍后构建的图像没有 git。
我意识到我可以将 git 哈希通过管道输出到一个文件并使用 COPY,但我只是想知道是否有更简洁的方法?
您有 3 个选择:
"ARG" 解决方案、"base" 解决方案和 "file" 解决方案。
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
您也可以在第一阶段将哈希值保存到一个文件中,在第二阶段复制该文件,然后在其中读取并使用它。
在 Dockerfile 中的阶段之间共享变量:
- 在第一阶段将 variables/ENVs 保存到文件中:
echo $runDeps > $DESTDIR/runtime.deps
- 从第一阶段复制文件到第二阶段:
$DESTDIR/runtime.deps
- 从第二阶段的文件中恢复值:
RUN apk add --no-cache --virtual .run-deps `cat /runtime.deps` gnutls-utils iptables libnl3 readline gettext libintl
我只看到了使用 COPY 在多阶段 Dockerfile 的阶段之间复制文件的示例,但是有没有一种方法可以简单地复制 ENV 变量?我的用例是从 git 图像开始,只是为了获取将成为构建一部分的提交哈希。我稍后构建的图像没有 git。
我意识到我可以将 git 哈希通过管道输出到一个文件并使用 COPY,但我只是想知道是否有更简洁的方法?
您有 3 个选择: "ARG" 解决方案、"base" 解决方案和 "file" 解决方案。
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
您也可以在第一阶段将哈希值保存到一个文件中,在第二阶段复制该文件,然后在其中读取并使用它。
在 Dockerfile 中的阶段之间共享变量:
- 在第一阶段将 variables/ENVs 保存到文件中:
echo $runDeps > $DESTDIR/runtime.deps
- 从第一阶段复制文件到第二阶段: $DESTDIR/runtime.deps
- 从第二阶段的文件中恢复值:
RUN apk add --no-cache --virtual .run-deps `cat /runtime.deps` gnutls-utils iptables libnl3 readline gettext libintl