Пошук уроків, статей та іншого контенту
Як передати конфігурацію контейнеру ззовні — ENV у Dockerfile, -e при запуску, файли env_file.
Курс Node.js уже розбирав, навіщо конфігурацію тримають окремо від коду через process.env, а не хардкоджену в самому коді. У контейнерах цей принцип особливо важливий: той самий образ має працювати з різною конфігурацією в різних середовищах (розробка, staging, продакшн) без пересборки образу під кожне з них.
ENV NODE_ENV=production
ENV PORT=3000ENV у Dockerfile встановлює значення, вбудоване в сам образ, — застосунок бачитиме ці значення в process.env, якщо їх не перевизначено при запуску контейнера.
docker run -e DATABASE_URL=postgresql://user:pass@db:5432/mydb -e NODE_ENV=production my-api-image-e передає (чи перевизначає) змінну середовища конкретному запущеному контейнеру, не змінюючи сам образ, — так той самий образ отримує різну конфігурацію бази даних для staging і продакшену без будь-якої пересборки.
Коли змінних багато, перелічувати кожну окремим -e незручно — --env-file (чи еквівалентна секція env_file у Docker Compose, наступний модуль) завантажує їх усі з одного файлу за раз:
docker run --env-file .env.production my-api-imageФайл із реальними секретами (.env.production з паролями бази даних) так само ніколи не комітять у git, як і звичайний .env локальної розробки (курс Node.js) — незалежно від того, що саме його споживає, контейнер чи процес напряму на хості, ризик витоку секретів той самий.
Значення, передане явно через -e (чи ENV в docker-compose.yml для конкретного сервісу), перевизначає значення ENV, зафіксоване в самому образі, — це і дозволяє одному образу гнучко працювати в різних середовищах без пересборки.
Хардкодити продакшн-специфічні значення (URL бази даних, API-ключі) прямо через ENV у Dockerfile — вбудовує їх в образ назавжди, роблячи неможливим використання того самого образу для іншого середовища без пересборки.
Комітити файл з реальними секретами (.env.production) у git — той самий ризик, що й зі звичайним .env локальної розробки.
Забувати, що ENV у Dockerfile — значення за замовчуванням, а не незмінна константа, — плутанина щодо того, звідки насправді береться конкретне значення в конкретному запущеному контейнері.
Змінні середовища дозволяють тому самому образу працювати з різною конфігурацією в різних середовищах без пересборки — ENV у Dockerfile задає значення за замовчуванням, вбудоване в образ, -e (чи --env-file) при запуску перевизначає їх для конкретного контейнера. Секрети в файлах змінних середовища контейнерів заслуговують тієї самої обережності (ніколи в git), що й звичайний .env файл локальної розробки.