构建第二个Docker镜像时如何访问另一个镜像的ENV变量
问题解答
不行,Docker本身没有提供类似COPY --from的语法,让你在不基于目标镜像构建的前提下直接读取它的环境变量。
原因说明
Docker镜像的环境变量属于镜像配置的一部分,只有当你以该镜像作为基础镜像(FROM image1)时,才会自动继承这些变量;而COPY --from只能复制镜像里的文件内容,无法直接读取镜像的配置项(比如环境变量)。
替代实现方案
1. 从外部提取变量后传递给构建过程
先在主机上用docker inspect提取image1里的VAR值:
VAR=$(docker inspect -f '{{range .Config.Env}}{{if eq (index (split . "=") 0) "VAR"}}{{.}}{{end}}{{end}}' image1 | cut -d'=' -f2)
然后构建第二个镜像时,用--build-arg把变量传进去:
docker build --build-arg VAR=$VAR -t image2 .
对应的第二个Dockerfile可以这样写:
# 接收构建参数 ARG VAR # 转为容器环境变量(可选,根据需求决定) ENV VAR=$VAR # 后续步骤可以直接使用VAR变量 RUN echo "当前VAR的值是: $VAR"
2. 将变量写入文件后跨镜像复制
在构建image1时,把环境变量写入一个文件:
ENV VAR=foo # 将变量写入文件保存 RUN echo "VAR=$VAR" > /opt/vars.env
然后在第二个Dockerfile里,用COPY --from复制这个文件,再加载里面的变量:
# 从image1复制变量文件 COPY --from=image1 /opt/vars.env /tmp/vars.env # 构建阶段加载变量执行命令 RUN set -a && source /tmp/vars.env && set +a && \ echo "构建阶段VAR的值是: $VAR" # 如果需要容器运行时也能使用该变量,把文件内容追加到初始化脚本 RUN cat /tmp/vars.env >> /etc/bash.bashrc
内容的提问来源于stack exchange,提问作者adizhol
相关产品推荐
相关产品推荐

