Vik*_*alk 6 dockerfile docker-build docker-multi-stage-build
我仅看到了使用COPY在多阶段Dockerfile的各个阶段之间复制文件的示例,但是有没有一种方法可以简单地复制ENV变量?我的用例是从git图像开始,只是要获取将作为构建一部分的提交哈希。我稍后使用的图像还没有git。
我意识到我可以将git哈希输出到文件中并使用COPY,但我只是想知道是否有更清洁的方法?
Jin*_*mcg 16
您有 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}
Run Code Online (Sandbox Code Playgroud)
另一种方法是在多个阶段使用基础容器:
FROM alpine:latest as base
ARG version_default
ENV version=$version_default
FROM base
RUN echo ${version}
FROM base
RUN echo ${version}
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到更多详细信息:https : //github.com/moby/moby/issues/37345
您也可以在第一阶段将散列保存到一个文件中,然后在第二阶段复制文件,然后读取它并在那里使用它。
要记住的重要部分是在每个阶段重新声明没有默认值的 ARG:
#### Declare Global build arg
ARG SOME_GLOBAL_ARG=some-value
### Build Stage 1
FROM base-image AS stage-1
## inherit global arg
ARG SOME_GLOBAL_ARG
## use global arg to set env var
ENV VAR1=${SOME_GLOBAL_ARG}
### Build Stage 2
FROM stage-1 AS stage-2
## inherit global arg
ARG SOME_GLOBAL_ARG
## use global arg to set env var
ENV VAR1=${SOME_GLOBAL_ARG}
Run Code Online (Sandbox Code Playgroud)