【发布时间】:2020-04-10 20:43:29
【问题描述】:
我正在努力将任何环境变量从 docker 传递到我容器中的节点进程。
在index.js 和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
这是我实际运行的代码,以防我看不到“杀死” 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