node.js - 无法将任何 ENV 变量从 docker 传递到 Node process.env
问题描述
我正在努力将任何环境变量从 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
- 我什至直接在我的
Dockerfile
via中尝试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-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 容器中时,我所有的环境变量都存在于 process.env
当我进入容器时,我可以回显变量:
# echo $MY_ENV
text
所以我认为这可能与我的系统有关,但我尝试在 sudo 和另一台机器(树莓派)上运行所有内容,但没有什么不同。同样的问题。
任何帮助或想法将不胜感激:)
解决方案
好的,在我的情况下,这可能会帮助其他人(在 docker 中相当新)问题是访问权限的差异,因为我的启动脚本位于package.json
:
"scripts": {
"start": "sudo node index.js"
},
如您所见,我使用的是 sudo。如果我删除它,我会得到我所有的环境变量process.env
所以这可能意味着 docker 用户与节点进程不同。
推荐阅读
- java - 从文件中解码“编译的 Java 类数据,版本 52.0”文本
- python - Pandas DataFrame,列中的列
- curl - 为 arm-linux-gnueabi 构建 libcurl:为什么 curl 忽略 openssl?
- html - 确保正文高度不超过浏览器高度
- android-emulator - Android模拟器的“插入虚拟耳机插头”是什么意思?
- ios - 如何在 Xcode 10.1 中添加 Alamofire
- javascript - 现在更改了 .htaccess 和永久链接,除了主页 404s
- vue.js - 为什么在 vuejs 中使用“数据”会有所不同?
- django - 尝试在已部署的 Heroku 应用程序上访问 Django /admin 时,在生产页面未找到错误
- python - 将 Scipy 模块 0.18 版本更新为 1.2.1 版本