Принцип «конфігурація в оточенні» (з методології Twelve-Factor App): той самий образ запускається в різних середовищах, а відмінності (адреси баз, ключі, режими) передаються змінними оточення.
Способи передачі:
docker run -e APP_ENV=production -e DB_HOST=db myapp # окремі змінні
docker run -e DB_PASSWORD myapp # значення з оточення хоста
docker run --env-file ./production.env myapp # з файлу KEY=value
# compose.yaml
services:
app:
image: myapp
environment:
APP_ENV: production
DB_HOST: db
env_file:
- .env.production
Пріоритет (від нижчого до вищого):
ENVв Dockerfile - значення за замовчуванням в образі;env_file/--env-file;environment/-e- перекривають попередні.
ENV в Dockerfile доречний для незмінних налаштувань образу (PHP_INI_DIR, шляхи, COMPOSER_ALLOW_SUPERUSER), але не для секретів чи значень, що відрізняються між середовищами: усе з ENV видно в docker image inspect і в кожному контейнері з цього образу.
Для Laravel:
- Laravel читає змінні оточення процесу через
env()- файл.envу контейнері не обов'язковий, якщо змінні передано Docker; php artisan config:cache«заморожує» значення на момент виконання команди. Якщо кеш зроблено під час збирання образу, змінні оточення, передані при запуску, ігноруватимуться. Кешувати конфігурацію треба при старті контейнера, коли змінні вже доступні;- поза файлами конфігурації
env()не працює післяconfig:cache- у коді лишеconfig().
Безпека:
- змінні оточення видно в
docker inspect, у/proc/<pid>/environ, вони потрапляють у звіти про помилки й дочірні процеси; - для секретів кращі файли секретів (Docker/Compose secrets монтуються в
/run/secrets/...) або менеджер секретів; .envз секретами - не в образ (.dockerignore) і не в Git.
Перевірка того, що бачить контейнер: docker exec app env чи docker compose config - підсумкова конфігурація Compose з підставленими значеннями.