如何将 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
(或ENTRYPOINT
或RUN
)的JSON形式时,根本没有插值;您的脚本应该从字面上将字符串 -e=$ENVIRONMENT
视为参数。相反,您需要使用 shell 形式,它将其包装在扩展环境变量的 shell 中。你不能用 ENTRYPOINT
和 CMD
的这种特殊拆分来做到这一点,但与此同时,这并不是真正必要的;把整个东西放在 CMD
.
# No ENTRYPOINT
# No quoting; Docker wraps this in `sh -c ...`
CMD npm start -- -e="$ENVIRONMENT" -t="$TESTS"
您也可以直接在您的应用程序中处理这些。例如,yargs
库有一个 .env()
函数,允许直接将环境变量用作选项。如果未直接提供,您还可以将 process.env.TESTS
设置为该选项的默认值。这种方法解决了使用所需参数组合构建(并可能扩展)有效命令行的麻烦。
正如标题所说...作为一个新手,我已经尝试了这个很好,但似乎无法弄清楚。
我有一个 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
(或ENTRYPOINT
或RUN
)的JSON形式时,根本没有插值;您的脚本应该从字面上将字符串 -e=$ENVIRONMENT
视为参数。相反,您需要使用 shell 形式,它将其包装在扩展环境变量的 shell 中。你不能用 ENTRYPOINT
和 CMD
的这种特殊拆分来做到这一点,但与此同时,这并不是真正必要的;把整个东西放在 CMD
.
# No ENTRYPOINT
# No quoting; Docker wraps this in `sh -c ...`
CMD npm start -- -e="$ENVIRONMENT" -t="$TESTS"
您也可以直接在您的应用程序中处理这些。例如,yargs
库有一个 .env()
函数,允许直接将环境变量用作选项。如果未直接提供,您还可以将 process.env.TESTS
设置为该选项的默认值。这种方法解决了使用所需参数组合构建(并可能扩展)有效命令行的麻烦。