node.js - 基于构建 ARG 在 Dockerfile 中有条件地设置 ENV 变量

标签 node.js docker

我想根据某些构建 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/

相关文章:

php - ECS 挂载卷到 nginx 容器

deployment - 如何在开发中编辑 Docker 容器中的代码?

c# - ASP.NET Core 的最小 docker

mysql - SQLException : Access denied when connecting to mysql in docker

php - 为什么 Docker Compose 重启可能会越来越多地渲染容器输出?

node.js - 从另一个 node.js 脚本启动 gulp 任务

java - 我无法在本地构建我的 Android 应用程序 - PhoneGap 新手

node.js - 可以为 Node 应用程序安装所有缺少的模块吗?

node.js - 通过主键搜索,RethinkDB 查询并没有变得更快。有什么问题吗?

node.js - 如何在开发过程中使 Hapi 自动重新加载应用程序