【问题标题】:How can I pass docker environment variables to an npm script?如何将 docker 环境变量传递给 npm 脚本?
【发布时间】:2020-10-23 17:17:33
【问题描述】:

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

我有一个 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  

谢谢

【问题讨论】:

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


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

    【讨论】:

    • 非常感谢!我正在使用 yargs 库来定义我的参数并为 ENVIRONMENT 设置了默认值,但需要 TESTS 参数。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2021-06-28
    • 2020-11-07
    • 2020-09-09
    • 1970-01-01
    • 2015-08-10
    • 2018-08-23
    相关资源
    最近更新 更多