当前位置: 首页 > 面试题库 >

Dockerfile中的条件ENV

相弘和
2023-03-14
问题内容

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

例如:类似

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

问题答案:

是的,可以,但是您需要使用build参数作为标志。您可以使用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


 类似资料:
  • 问题内容: 我想在Dockerfile内将文件复制到映像中(如果存在),pip的requirements.txt文件似乎是一个不错的选择,但是如何实现呢? 要么 问题答案: 目前尚不支持此功能(因为我怀疑它会导致图像无法复制,因为相同的Dockerfile会根据文件的存在来复制或不复制该文件)。 在问题13045中,仍要求使用通配符“ ”(2015年5月)。 目前(2015年7月)不会在Docke

  • 问题内容: 我正在尝试编写一个docker文件,该文件将运行RUN命令以在package.json文件中搜索单词并对其执行操作: 这是我简单的dockerfile: 如您所见,我只想要一个简单的if语句,但它得到此错误: 我应该如何运行命令?谢谢。 问题答案: 就像在shell上键入内容一样,您需要在前面加上换行符或分号:

  • 问题内容: 我有dockerfile 然后我建立它 并运行它。 是否可以从命令行传递参数并将其与Dockerfile中的其他参数一起使用?我的意思是 并以此参数构建。 问题答案: 看起来可能不太干净,但是您可以按照以下方式使用Dockerfile: 然后将图像构建为: 要么

  • 我正在尝试dockerize一个基本的nodejs应用程序。我的dockerfile如下 但我总是收到同样的错误 我该怎么解决?

  • 问题内容: 相等的: 左联接: 相等的: 正确加入 相等的: 当我们在“ WHERE”子句中指定联接条件与“ ON联接条件”时有什么区别? 通过在“ ON”子句和“ WHERE”子句中指定联接条件,我们在内部,左外部,右外部联接中是否获得相同的结果。请指教。 问题答案: 好吧,您所谓的“等效”并不等同于外部联接。让我们以左联接为例。 加入条件: 与哪里: 将条件放到WHERE子句中可以有效地使联接

  • 问题内容: 我有一个Dockerfile扩展了声明一个的图像。有没有一种方法可以覆盖指令,从而“删除”指令? 问题答案: 没有。 这样做的唯一方法是,如果您克隆用作基础图像(in中的一个)的图像,然后手动删除该指令。然后构建它并用作您的基础。