Пошук уроків, статей та іншого контенту
Передавайте конфігурацію контейнерам через змінні середовища та використовуйте їх у застосунках.
Змінні середовища — це пари «ім’я–значення», які контейнер отримує під час запуску. Застосунок читає їх так само, як звичайні налаштування.
За допомогою змінних середовища можна передавати:
порт застосунку;
назву або режим роботи;
адресу іншого сервісу;
параметри підключення;
значення, які відрізняються для розробки, тестування та продакшену.
Це дає змогу не змінювати код або образ контейнера для кожного середовища.
У Node.js змінні середовища доступні через process.env:
const port = process.env.PORT || 3000;
const appName = process.env.APP_NAME || "default-app";Усі значення зі process.env є рядками. Якщо потрібно отримати число, його слід перетворити:
const port = Number(process.env.PORT || 3000);docker runНайпростіший спосіб передати змінну контейнеру — використати параметр --env або скорочений варіант -e:
docker run --rm -e APP_NAME=demo-app nginxУ контейнері з’явиться змінна APP_NAME зі значенням demo-app.
Можна передати кілька змінних:
docker run --rm \
-e APP_NAME=demo-app \
-e LOG_LEVEL=debug \
nginxЗмінна може мати значення з пробілами, якщо використати лапки:
docker run --rm -e APP_DESCRIPTION="Demo application" nginxСтворимо невеликий HTTP-застосунок, який читає конфігурацію зі змінних середовища.
app.jsconst http = require("node:http");
const port = Number(process.env.PORT || 3000);
const appName = process.env.APP_NAME || "container-app";
const logLevel = process.env.LOG_LEVEL || "info";
const apiUrl = process.env.API_URL || "not configured";
const server = http.createServer((request, response) => {
response.writeHead(200, { "Content-Type": "application/json; charset=utf-8" });
response.end(
JSON.stringify({
appName,
logLevel,
apiUrl,
message: "Конфігурацію отримано зі змінних середовища",
}),
);
});
server.listen(port, () => {
console.log(`${appName} запущено на порту ${port}`);
console.log(`Рівень логування: ${logLevel}`);
});DockerfileFROM node:22-alpine
WORKDIR /app
COPY app.js .
# Значення за замовчуванням для контейнера
ENV NODE_ENV=production
CMD ["node", "app.js"]Зберіть образ:
docker build -t env-demo .Запустіть контейнер і передайте змінні через -e:
docker run --rm \
--name env-demo-container \
-e APP_NAME=orders-api \
-e LOG_LEVEL=debug \
-e API_URL=https://api.example.test \
-e PORT=3000 \
-p 3000:3000 \
env-demoПісля запуску відкрийте інший термінал і виконайте:
curl http://localhost:3000Приклад відповіді:
{
"appName": "orders-api",
"logLevel": "debug",
"apiUrl": "https://api.example.test",
"message": "Конфігурацію отримано зі змінних середовища"
}Параметр -p 3000:3000 з’єднує порт 3000 на комп’ютері з портом 3000 у контейнері. Значення змінної PORT визначає порт, на якому слухає сам застосунок.
Якщо змінних багато, передавати їх окремими параметрами незручно. Для цього можна створити файл, наприклад .env:
APP_NAME=orders-api
LOG_LEVEL=debug
API_URL=https://api.example.test
PORT=3000Передайте файл під час запуску:
docker run --rm \
--name env-demo-container \
--env-file .env \
-p 3000:3000 \
env-demoФайл має містити по одному запису на рядок:
NAME=valueПорожні рядки та рядки, що починаються з #, можна використовувати для форматування й коментарів:
# Налаштування застосунку
APP_NAME=orders-api
LOG_LEVEL=debugФайл .env не передається в образ автоматично. Він використовується клієнтом Docker під час команди docker run, якщо явно вказати --env-file.
У Dockerfile можна оголосити змінну через інструкцію ENV:
ENV NODE_ENV=productionЦе створює змінну зі значенням за замовчуванням у кожному контейнері, створеному з цього образу.
Значення можна змінити під час запуску:
docker run --rm \
-e NODE_ENV=development \
env-demoЗначення, передане під час docker run, має перевагу над значенням ENV у Dockerfile.
ENV зручно використовувати для безпечних значень за замовчуванням, наприклад режиму роботи або стандартного порту. Конфігурацію, яка залежить від конкретного середовища, краще передавати під час запуску.
Щоб переглянути змінні середовища запущеного контейнера, можна виконати команду env:
docker exec env-demo-container envЩоб вивести конкретну змінну:
docker exec env-demo-container printenv APP_NAMEЦі команди корисні, коли потрібно перевірити, чи справді контейнер отримав очікувані значення.
Змінні середовища зручні для конфігурації, але не є повністю захищеним сховищем секретів.
Не варто:
записувати паролі та токени безпосередньо в Dockerfile;
додавати файл .env із секретами до системи контролю версій;
виводити секретні змінні в журнали;
передавати секрети через командний рядок у спільному середовищі без потреби.
Значення змінних контейнера можуть бути доступні через інформацію про контейнер або процеси. Для навчальних і простих локальних сценаріїв змінні середовища підходять, але для секретів у продакшені слід використовувати спеціалізовані механізми керування секретами.
Змінна PORT повинна відповідати порту, на якому застосунок слухає всередині контейнера:
docker run --rm -e PORT=3000 -p 3000:3000 env-demoЯкщо застосунок слухає 3000, але порт контейнера проброшено неправильно, звернутися до нього з хоста не вийде.
Запуск із файлом .env без параметра --env-file не передасть значення:
docker run --rm env-demoПотрібно явно вказати файл:
docker run --rm --env-file .env env-demoЗмінні середовища завжди надходять у застосунок як рядки. Тому значення порту потрібно перетворити:
const port = Number(process.env.PORT || 3000);.env має неправильний форматПравильний запис:
APP_NAME=orders-apiПоширені проблеми:
пропущене =;
зайві пробіли в імені змінної;
неправильне ім’я файлу;
передавання не того файлу через --env-file.
Змінні передаються контейнеру під час його запуску. Якщо потрібно змінити конфігурацію, зупиніть старий контейнер і запустіть новий із новими значеннями.
Змінні середовища дають змогу передавати конфігурацію контейнеру без зміни коду.
У команді docker run змінні задаються через -e або --env.
Кілька змінних зручно зберігати у файлі та передавати через --env-file.
У Node.js змінні доступні через process.env.
Значення змінних завжди є рядками, тому числа потрібно перетворювати.
ENV у Dockerfile задає значення за замовчуванням.
Секрети не слід зберігати у Dockerfile або додавати до репозиторію.