如何将docker环境变量传递给npm脚本?

时间:2020-10-23 17:17:33

标签: node.js docker npm dockerfile npm-scripts

正如标题所述……作为一个新手,我已经做了一次很好的尝试,但似乎无法弄清楚。

我有一个dockerfile

FROM node:12
WORKDIR /app
COPY . /app
RUN npm config set registry https://registry.npmjs.org/
RUN npm install
EXPOSE 8080
ENTRYPOINT ["npm", "start",]
CMD [ "--", "-e=$ENVIRONMENT", "-t=$TESTS" ]

以及package.json中的脚本,如下所示:

"scripts": {
    "start": "node main.js"
  }

Main.js需要两个参数。 e&t。 我正在努力将它们传递到容器中,然后交给脚本来运行main.js(请注意,有一个原因使我通过脚本ive运行它只是使此示例变得简单)

要运行我的npm脚本,我可以这样做:

npm start -- -e=abc -t=xyz

所以我已经尝试过了,但是没有乐趣:

docker run -e ENVIRONMENT=abc -e TESTS=xyz myimage  

谢谢

1 个答案:

答案 0 :(得分:1)

使用CMD(或ENTRYPOINTRUN)的JSON形式时,根本没有插值;您的脚本应从字面上看到字符串-e=$ENVIRONMENT作为参数。取而代之的是,您需要使用shell形式,它将把它包装在扩展环境变量的shell中。您无法通过ENTRYPOINTCMD的这种特殊分离来做到这一点,但同时,它并不是真正必要的。只需将整个内容放入CMD

# No ENTRYPOINT
# No quoting; Docker wraps this in `sh -c ...`
CMD npm start -- -e="$ENVIRONMENT" -t="$TESTS"

您也可以在您的应用程序中直接处理它们。例如,yargs库具有.env()函数,该函数允许将环境变量直接用作选项。如果未直接提供,则还可以将process.env.TESTS设置为该选项的默认值。这种方法避免了使用所需参数组合来构造(并可能扩展)有效命令行的麻烦。