正如标题所述……作为一个新手,我已经做了一次很好的尝试,但似乎无法弄清楚。
我有一个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
谢谢
答案 0 :(得分:1)
使用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
设置为该选项的默认值。这种方法避免了使用所需参数组合来构造(并可能扩展)有效命令行的麻烦。