【问题标题】:Cannot pass any ENV variables from docker to Node process.env无法将任何 ENV 变量从 docker 传递到 Node process.env
【发布时间】:2020-04-10 20:43:29
【问题描述】:

我正在努力将任何环境变量从 docker 传递到我容器中的节点进程。 在index.jsprocess.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

这是我实际运行的代码,以防我看不到“杀死” process.env:

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

  • 经典之道之二:

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

  • 我什至通过ENV 直接在我的Dockerfile 中尝试!并且没有任何东西传递给进程:
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-compose,但是当然,如​​果 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:

奇怪的是,即使在 Postgres 图像中,也没有传递任何 env 变量

有关信息,这是我的index.js

require('dotenv').config()

console.log('env variables: ')
Object.entries(process.env).forEach(kv => {
  console.log(kv[0] + ': ' + kv[1])
})
  • 当我直接运行我的代码而不是在 docker 容器中时,我的所有 env 变量都存在于 process.env 中

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

# echo $MY_ENV
text

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

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

【问题讨论】:

  • 你可以试试require('dotenv').config({ path: require('find-config')('.env') })吗?
  • 哦,抱歉,没有看到你的评论,看看我的自动回复;)

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


【解决方案1】:

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

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

如您所见,我使用的是 sudo。如果我删除它,我会在process.env 中获得我所有的环境变量 所以这可能意味着docker用户与节点进程不同。

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2022-01-03
    • 1970-01-01
    • 2016-08-14
    • 2016-10-28
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多