Dockerfile 中的条件 ENV

新手上路,请多包涵

是否可以根据构建的值在 Dockerfile 中有条件地设置 ENV 变量 ARG

例如:类似的东西

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

更新:基于马里奥回答的当前使用情况:

 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

原文由 Matthew Herbst 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 827
2 个回答

是的,这是可能的,但您需要使用您的构建参数作为标志。您可以使用 shell 的 参数扩展 功能来检查条件。这是一个概念验证 Docker 文件:

 FROM debian:stable
ARG BUILD_DEVELOPMENT
# if --build-arg BUILD_DEVELOPMENT=1, set NODE_ENV to 'development' or set to null otherwise.
ENV NODE_ENV=${BUILD_DEVELOPMENT:+development}
# if NODE_ENV is null, set it to 'production' (or leave as is otherwise).
ENV NODE_ENV=${NODE_ENV:-production}

测试构建:

 docker build --rm -t env_prod ./
...
docker run -it env_prod bash
root@2a2c93f80ad3:/# echo $NODE_ENV
production
root@2a2c93f80ad3:/# exit
docker build --rm -t env_dev --build-arg BUILD_DEVELOPMENT=1 ./
...
docker run -it env_dev bash
root@2db6d7931f34:/# echo $NODE_ENV
development

原文由 Ruslan Kabalin 发布,翻译遵循 CC BY-SA 4.0 许可协议

您不能直接在 Dockerfile 中运行 bash 代码,但必须使用 RUN 命令。因此,例如,您可以将 ENV 更改为 RUN 并导出 if 中的变量,如下所示:

 ARG BUILDVAR=sad
RUN if [ "$BUILDVAR" = "SO" ]; \
    then export SOMEVAR=hello; \
    else export SOMEVAR=world; \
    fi

我没有尝试过,但应该可以。

原文由 Mario Cairone 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题