根据构建ARG在Dockerfile中有条件地设置ENV变量

时间:2019-02-12 17:49:57

标签: node.js docker

我想根据某些构建ARG在我的Dockerfile中有条件地设置一些ENV变量。由于某种原因,ENV变量不会直接映射到实际的构建ARG,即我无法执行以下操作:

ARG myvar
ENV MYVAR $MYVAR

它的映射非常复杂,我无法做,例如“ prefix-$ {$ MYVAR}”,或者其他任何一种。

我知道只是对EXPORT使用shell命令(然后可以访问if语句),但是以这种方式导出环境变量不会像我需要的那样在容器中持续存在。如果唯一的解决方案是为我需要的每个RUN / CMD重复添加所需的env前缀(以及到达该位置所需的所有逻辑),那么我会接受的。

我也知道这个答案Conditional ENV in Dockerfile,它确实有一个解决方案,其中使用(本质上)三元数来触发某个ENV值,但是由于我的情况更加复杂,我不能只是使用给定的解决方案。

有没有办法在Dockerfile中编写“逻辑”,同时仍然可以访问ENV等Docker命令?

任何帮助将不胜感激!

PS。

这是一个用于构建Node映像的Dockerfile,所以我的最后几步基本上看起来像

RUN npm run build
CMD ["npm", "run", "start"]

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么您会想念

if BUILD_VAR == v1:
  set ENV MYVAR=aValue
else if YOUR_VAR == v2:
  set ENV MYVAR=anotherValue

解决方案:

ARG BUILD_VAR=v1

FROM scratch as build_v1
ONBUILD ENV MYVAR=aValue

FROM scratch as build_v2
ONBUILD ENV MYVAR=anotherValue

FROM build_${YOUR_VAR} AS final
...
RUN npm run build
CMD ["npm", "run", "start"]

顶级BUILD_VAR允许您通过docker build --build-arg BUILD_VAR=v1 .传递条件

ONBUILD被使用,因此仅在选择了相应分支的情况下才执行指令ENV

答案 1 :(得分:0)

我在容器上设置代理服务器时遇到了类似的问题。

我使用的解决方案是一个入口点脚本和另一个用于环境变量配置的脚本。使用 RUN,您可以确保在构建时运行配置脚本,并在运行容器时确保 ENTRYPOINT。

入口点脚本如下所示:

#!/bin/bash
    
# Run any other commands needed 

# Run the main container command
exec "$@"

在 Dockerfile 中,配置:

#copy bash scripts
COPY configproxy.sh /root
COPY startup.sh .    
RUN ["/bin/bash", "-c", ". /root/configproxy.sh"]
ENTRYPOINT ["./entrypoint.sh"]
CMD ["sh", "-c", "bash"]

看看here