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

How can I pass docker environment variables to an npm script?

正如标题所说...作为一个新手,我已经尝试了这个很好,但似乎无法弄清楚。

我有一个 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(请注意,为什么我 运行 通过我刚刚制作的脚本将其设置为这个例子是有原因的简单)

对于 运行 我的 npm 脚本我可以这样做:

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

所以我已经试过了,但并不开心:

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

谢谢

当你使用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 设置为该选项的默认值。这种方法解决了使用所需参数组合构建(并可能扩展)有效命令行的麻烦。