为什么我的节点容器忽略了我在docker-compose.yml中设置的环境变量?

时间:2017-11-23 09:21:06

标签: node.js docker npm docker-compose

在我的docker-compose.yml中,我设置了环境NODE_ENV

node2:
    image: ...
    environment:
     - "NODE_ENV=production"

我的Dockerfile,

FROM node:latest
... //all the ususal stuff
CMD ["npm", "start"]

我的晚上,

  "scripts": {
    "start": "NODE_ENV=development node --inspect ./bin/www"
  },

但是当我运行docker-compose时,我发现nodejs代码仍然在开发中运行,而不是在生产中运行。那是为什么?

我的第二个问题是在这里实现我想做什么的正确方法是什么,在没有docker的情况下运行我的nodejs,即使用npm start,我希望它在开发模式下运行,但在生产中运行docker模式?

----更新-----

对于我现在的第一个问题,我理解我的npm start覆盖了docker-composer.yml中的NODE_ENV = production,而不是相反。

但是对于我的第二个问题,我仍在寻找一个简单的解决方案。

感谢我到目前为止的答案。

2 个答案:

答案 0 :(得分:-1)

我的第一个猜测是在i1 <- order(mat) cbind(row(mat)[i1], col(mat)[i1]) # [,1] [,2] #[1,] 1 3 #[2,] 3 1 #[3,] 2 2 #[4,] 2 3 #[5,] 1 1 #[6,] 3 3 #[7,] 1 2 #[8,] 2 1 #[9,] 3 2 中为不同的环境设置不同的npm script条目,例如用于生产的package.json和用于开发/调试的start - with { {1}}。

但是,如果你想坚持使用一个inspect,那么你可以考虑使用ENV_VARS script的{​​{1}}默认值,如果它还没有set(由Docker提供):

bash

参考文献:
http://www.tldp.org/LDP/abs/html/parameter-substitution.html
https://glebbahmutov.com/blog/shell-variables-in-npm-scripts/

答案 1 :(得分:-1)

这篇文章“Working with Environment Variables in Node.js”给了我一些思考。

所以我首先使用了if-env,因为它建议我的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所说,更重要的是,我需要一种简单的方法来设置环境变量并覆盖它们,如果有必要,现在我使用per-env,我的npm script看起来像这样,< / p>

  "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"
  },