为什么我的节点容器忽略我在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" },