我想根据某些构建 ARG 在我的 Dockerfile 中有条件地设置一些 ENV 变量。出于某种原因,ENV var 不会直接映射到实际构建 ARG,即我不能执行以下操作:
ARG myvar
ENV MYVAR $MYVAR
它是一个非常复杂的映射,我无法做到,比如“prefix-${$MYVAR}”或其他任何东西。
我知道只使用带有 EXPORT 的 shell 命令(然后可以访问 if 语句),但是以这种方式导出环境变量不会按照我需要的方式在容器中持续存在。如果唯一的解决方案是为我需要它的每个 RUN/CMD(以及到达那里所需的所有逻辑)重复添加所需的环境前缀,那么我会接受。
我也知道这个答案Conditional ENV in Dockerfile ,它确实有一个解决方案,其中(本质上)三元用于触发某个 ENV 值,但由于我的情况更复杂,我不能只使用给定的解决方案。
有没有办法在 Dockerfile 中编写“逻辑”,同时仍然可以访问 ENV 等 Docker 命令?
非常感谢任何帮助!
附言。
这是一个用于构建 Node 镜像的 Dockerfile,所以我最后的几个步骤基本上是这样的
RUN npm run build
CMD ["npm", "run", "start"]
最佳答案
如果我正确理解你的问题,你想要
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
仅在选择了相应的分支时才执行。
关于node.js - 基于构建 ARG 在 Dockerfile 中有条件地设置 ENV 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54655901/