为什么我的节点容器忽略我在docker-compose.yml中设置的环境variables?
在我的docker-compose.yml中,我设置了环境NODE_ENV
node2: image: ... environment: - "NODE_ENV=production"
我的Dockerfile,
FROM node:latest ... //all the ususal stuff CMD ["npm", "start"]
我的npm,
"scripts": { "start": "NODE_ENV=development node --inspect ./bin/www" },
但是当我运行docker-compose时,发现nodejs代码仍然在开发中运行,而不是在生产中。 这是为什么?
我的第二个问题是,在没有docker的情况下运行我的nodejs,例如使用npm start
,我希望它在开发模式下运行,但是在生产模式下运行docker时,实现我想要在此处执行的操作的正确方法是什么?
—-更新—–
对于我现在的第一个问题,我明白这是我的npm start
覆盖NODE_ENV =生产docker-composer.yml不是另一种方式。
但是对于我的第二个问题,我仍然在寻找一个简单的解决scheme。
感谢迄今为止的答案。
我的第一个猜测是在你的package.json
有不同的npm script
条目,用于不同的环境,比如start
生产和inspect
开发/debugging – 使用ENV_VARS
。
但是如果你想坚持一个script
,那么你可能会考虑使用一个bash
缺省值,例如${parameter:-default}
作为NODE_ENV
如果没有被Docker设置的话):
"start": "NODE_ENV=${NODE_ENV:-development} node --inspect ./bin/www"
参考文献:
http://www.tldp.org/LDP/abs/html/parameter-substitution.html
https://glebbahmutov.com/blog/shell-variables-in-npm-scripts/
本文“ 在Node.js中使用环境variables ”给了我一些想法。
所以我第一次使用if-env,因为它build议和我的npm script
看起来喜欢这个,
"scripts": { "start": "if-env NODE_ENV=production && npm run start:prod || npm run start:dev", "start:dev": "DEBUG=dummy-app:* node --inspect ./bin/www", "start:prod": "node ./bin/www" }
但是正如https://github.com/ericclemmons/if-env/issues/6所说,更重要的是我需要一个简单的方法来设置环境variables并覆盖它们,如果必要的话,现在我正在使用per-env和我的npm script
看起来喜欢这个,
"per-env": { "production": { "DBPASS":"superman", //this can be overwrote again }, "development":{ "DBPASS":"batman", "DEBUG":"dummy-app:*", } }, "scripts": { "start":"per-env", "start:development": "node --inspect ./bin/www", "start:production": "node ./bin/www" },