Я новичок в nodejs и не могу понять, почему переменные среды не всегда доступны.
Вары env в моем .env автоматически разбираются с помощью docker-compose. Поэтому я не использую пакет dotenv.
console.info(process.env.API_URL) // outputs undefined
Но в асинхронной функции (возможно, она не работает во всех асинхронных функциях)
async function foo() {
console.info(process.env.API_URL) // outputs http://example.com
}
Переместив несколько способов console.info в моем index.ts, я нашел строку, в которой становятся доступными переменные env:
// index.ts
import {createConnection} from 'typeorm'
console.info(process.env.API_URL) // outputs undefined
createConnection()
console.info(process.env.API_URL) // outputs http://example.com
Есть идеи, почему это происходит?
Редактировать :
Я использую docker-compose.yml:
version: '3.7'
services:
server:
build:
context: ./docker-build
target: server-develop
ports:
- "3200:3000"
volumes:
- .:/var/app
command: "yarn run dev"
Документы Docker, кажется, сообщает, что файл .env анализируется по умолчанию, если env_file не указан. Скриншот из документации докеров:
Однако я не вижу env vars при использовании docker-compose exec server env.
Но если я укажу env_file в docker-compose.yml (см. Ниже), переменные среды загружаются правильно.
version: '3.7'
services:
server:
build:
context: ./docker-build
target: server-develop
env_file: .env # the only change
ports:
- "3200:3000"
volumes:
- .:/var/app
Возможно, я неправильно понял, что на самом деле делает докер, когда он говорит
The .env file is loaded by default





Вы можете использовать dotenv отсюда https://www.npmjs.com/package/dotenv
Вероятно, вы используете nodemon и, насколько мне известно, он загружает только переменную NODE_ENV. Используя dotenv, вы можете просто:
.env в корневой папке, куда вы поместите свои переменные envrequire('dotenv').config()Вы найдете дополнительную информацию на самой странице пакета npmjs, например, измените команду запуска, чтобы она могла автоматически загружать файл .env, и многое другое.
Np. Просто запустите докер, указав файл sudo docker run [...] --env-file ./my_env.list [...], или укажите свою переменную в файле docker-compose по пути services -> client-side-app -> environment -> MY_VAR = "my-var" .
Вы правы, однако я отредактировал свой вопрос, чтобы уточнить, что я ожидал от синтаксического анализа docker env
Спасибо, но я хочу, чтобы переменные среды анализировались механизмом докеров и были доступны в контейнере до запуска nodejs.