根据 Dockerfile 中的主机名有条件地设置 ENV var



如何根据主机名在 Dockerfile 中设置 ENV var?我试过这个:

RUN if [ hostname = "foo" ]; then ENV BAR "BAZ"; else ENV BAR "BIFF"; fi

但这失败了

ENV: not found

运行 如果 [ 主机名 = "foo" ]; 然后 ENV BAR "BAZ"; 否则 ENV BAR "BIFF"; fi

你不能嵌套 docker 构建指令,RUN指令之后的所有内容都在镜像上下文中执行,docker 构建命令不会存在在那里。因此,这解释了您看到的错误。

即使您将其转换为正确的 shell 代码BAR也只会在构建期间对单个RUN指令处于活动状态。

在主机上进行编排并通过run -eBAR传递到容器,或者将启动脚本添加到映像,以便在容器启动时根据需要设置BAR

FROM foo
COPY my-start.sh /
CMD ["/my-start.sh"]

首先,你不能将 Docker build 命令嵌入到 shell of RUN 中,shell 会在构建过程中在中间容器内运行,而 Docker 构建命令将由 Docker 构建引擎运行,它们是不同的东西。此外,Docker不支持像IF这样的条件命令或类似的东西。Docker是关于不可变的基础设施,Dockerfile是你的镜像的定义,它应该能够生成相同的镜像,无论它在什么构建上下文中。而且从交付的角度来看,镜像是你的可交付构建工件,如果你想交付不同的东西,那么使用不同的 Dockerfile 来构建不同的镜像,否则如果差异是关于运行时的,我认为你真的可以考虑将env定义推迟到运行时-e docker run选项。

@shizhz & @Erik Dannenberk 解释了构建失败的原因。

但是,如果您确实需要该行为,我建议您编写一个小脚本来执行此操作:

export BAR=`[[ hostname = "foo" ]] && echo "BAZ" || echo "BIFF"`
docker build -t hello/hi - <<EOF
FROM alpine
ENV BAR $BAR
CMD echo $BAR
EOF

最新更新