Переменные окружения и .env
Что такое env-переменные, как их задают и наследуют процессы, и почему конфиг приложений держат в окружении.
Что такое переменная окружения
Переменная окружения — это пара имя-значение, которую процесс получает от родителя и видит во время работы. Через них приложению передают конфигурацию: к какой базе подключаться, на каком порту слушать, в каком режиме работать.
Посмотреть текущее окружение:
$ printenv | head
PATH=/usr/local/bin:/usr/bin:/bin
HOME=/home/deploy
LANG=en_US.UTF-8
$ echo "$HOME"
/home/deploy
Обращаются к переменной через $ИМЯ. По соглашению имена пишут
заглавными.
Задать переменную
В шелле есть разница между «локальной» переменной и переменной окружения:
NAME=value # обычная переменная shell, видна только в нём
export NAME=value # переменная окружения, наследуется потомками
Ключевое слово — наследование. Когда процесс запускает другой,
дочерний получает копию окружения родителя. export помечает переменную
как «передавать потомкам». Без export дочерний процесс её не увидит.
Задать переменную только для одной команды, не меняя своё окружение:
PORT=9090 ./app # app увидит PORT=9090, шелл — нет
Файл .env
Когда переменных много, их держат в файле .env:
# .env
DB_HOST=localhost
DB_PORT=5432
DB_PASSWORD=secret
LOG_LEVEL=info
Это просто пары KEY=value по строке. Сам по себе .env шеллом не
читается: его подгружает приложение, docker compose (env_file:) или
шелл вручную:
set -a; . ./.env; set +a # загрузить .env в окружение
Главное правило: .env с секретами не коммитят в git. Его добавляют в
.gitignore, а рядом держат .env.example без значений: шаблон того, что
нужно заполнить.
Почему конфиг в окружении
Хранить конфиг в переменных окружения — устоявшаяся практика (часть подхода «twelve-factor app»). Причины:
- один и тот же образ работает в dev и prod, отличаясь только переменными; пересобирать не надо;
- секреты не лежат в коде, их подставляют при запуске;
- сменить настройку значит перезапустить с другим окружением, без правки файлов внутри.
Поэтому контейнеры конфигурируют через -e KEY=value и env_file, а не
через зашитые в образ конфиги.
Что важно запомнить
Переменная окружения — пара имя-значение, которую процесс наследует от родителя; через неё передают конфиг приложению.
export помечает переменную для передачи потомкам; без него дочерний
процесс её не увидит. VAR=value команда задаёт переменную разово.
Конфиг держат в окружении (.env, -e, env_file), чтобы один образ
работал везде, а секреты не лежали в коде. .env с секретами в git не
коммитят.
В следующем уроке разберём диск: куда уходит место и как искать виновника.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс