无法将任何ENV变量从docker传递到Node process.env

时间:2019-12-18 10:06:20

标签: node.js docker docker-compose environment-variables dockerfile

我正在努力将所有环境变量从docker传递到容器中的节点进程。 在process.env SUDO_GID: 0 SUDO_UID: 0 SUDO_USER: root SUDO_COMMAND: /usr/local/bin/node index.js ... 键中进行打印时,这是我得到的:

MY_ENV=text

我应该至少获得我尝试通过的docker run -e MY_ENV=text mytestcontainer。 这是到目前为止我尝试过的不同方法:

  • 经典方式:

docker run --privileged -u root -v /sys:/sys -v /dev/mem:/dev/mem -e MY_ENV=text mytestcontainer

这是我实际运行的代码,以防万一我看不到进程被杀死的情况。

docker run --env-file ./.env mytestcontainer

  • 经典方式之二:

Dockerfile

  • 我什至可以通过ENV直接在FROM balenalib/raspberrypi3-node ENV MY_ENV=text ARG api_port=7070 RUN apt-get update && apt-get install -yq --no-install-recommends pigpio RUN sudo apt-get install build-essential RUN sudo apt-get install python # Create app directory WORKDIR /opt/app # Install app dependencies COPY package.json package-lock.json* ./ RUN npm cache clean --force && npm install COPY . /opt/app RUN npm rebuild pigpio EXPOSE $api_port CMD [ "npm", "run", "start" ] 中尝试!而且没有任何东西传递给该过程:
docker run
  • 我也通过docker-compose进行了尝试,但是,当然,如果version: "3" services: app: image: mytestcontainer restart: always privileged: true user: root depends_on: - postgres ports: - "7070:7070" volumes: - /sys:/sys - /dev/mem:/dev/mem environment: MY_ENV: text postgres: image: postgres:alpine ports: - "35432:5432" volumes: - db:/var/lib/postgresql/data environment: POSTGRES_USER: testUser POSTGRES_PASSWORD: test POSTGRES_DB: test POSTGRES_SCHEMA: test volumes: db: 不起作用,为什么docker-compose也可以工作!
index.js

奇怪的是,即使在Postgres图片中,也不会传递任何env变量

有关信息,这是我的require('dotenv').config() console.log('env variables: ') Object.entries(process.env).forEach(kv => { console.log(kv[0] + ': ' + kv[1]) })

# echo $MY_ENV
text
  • 当我直接运行代码而不是在Docker容器中运行时,我所有的env变量都存在于process.env中

  • 当我进入容器时,我可以回显变量:

public Integer parseString(String value) {
       return null;
}

所以我认为这可能与我的系统有关,但是我尝试在sudo和其他机器(树莓派)上运行所有内容,没有什么不同。同样的问题。

任何帮助或想法将不胜感激:)

1 个答案:

答案 0 :(得分:0)

在我的情况下可能会帮助其他人的东西(在docker中是相当新的) 由于我在package.json中的启动脚本,问题在于访问权限有所不同:

"scripts": {
    "start": "sudo node index.js"
 },

如您所见,我正在使用sudo。如果删除它,我的所有env变量都将放在process.env中 因此,这可能意味着docker用户与节点进程不同。