Dockerfile中的条件ENV

是否有可能根据构buildARG的值有条件地设置一个Dockerfile中的ENVvariables?

例如:像

 ARG BUILDVAR=sad ENV SOMEVAR=if $BUILDVAR -eq "SO"; then echo "hello"; else echo "world"; fi 

更新:基于Mario回答的当前使用情况:

 ARG BUILD_ENV=prod ENV NODE_ENV=production RUN if [ "${BUILD_ENV}" = "test" ]; then export NODE_ENV=development; fi 

但是,使用--build-arg BUILD_ENV=test ,然后进入主机,我仍然得到

 docker run -it mycontainer bin/bash [root@brbqw1231 /]# echo $NODE_ENV production 

您不能直接在Dokerfile中运行bash代码,但是您必须使用RUN命令。 因此,例如,你可以改变ENV与RUN结束导出variables在if,如下所示:

 ARG BUILDVAR=sad RUN if $BUILDVAR -eq "SO"; then export SOMEVAR=hello; else export SOMEVAR=world; fi 

我没有尝试,但应该工作。

虽然您不能设置有条件的ENVvariables,但您可能能够使用RUN命令和空合并环境variables来实现您的目标:

 RUN node /var/app/current/index.js --env ${BUILD_ENV:-${NODE_ENV:-"development"}} 

你的逻辑其实是正确的。 这里的问题是RUN export ...将无法在Dockerfile中工作,因为export命令不会持续存在于所有映像中。 Dockerfiles创build一个临时容器为了生成它的图像,所以环境variables将不存在。

ENV另一方面根据文档状态:

使用ENV设置的环境variables将在从结果图像运行容器时持久化。

要做到这一点的唯一方法是在您的图像生成容器时,你的docker run命令,并围绕你的逻辑:

 if [ "${BUILD_ENV}" = "test" ]; then docker run -e NODE_ENV=development myimage else docker run myimage fi 

将值传递给Dockerfile,然后传递给入口点脚本

从命令行传递你所需的值(TARG)

 docker run --env TARG=T1_WS01 -i projects/msbob 

然后在你的Dockerfile放入这样的东西

 Dockerfile: # if $TARG is not set then "entrypoint" defaults to Q0_WS01 CMD ./entrypoint.sh ${TARG} Q0_WS01 

entrypoint.sh脚本只读取第一个参数

 entrypoint.sh: #!/bin/bash [ $1 ] || { echo "usage: entrypoint.sh <$TARG>" ; exit ; } target_env=$1