← Linux: администрирование
10 мин · просто · Урок 5 из 10

Переменные окружения и .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»). Причины:

Поэтому контейнеры конфигурируют через -e KEY=value и env_file, а не через зашитые в образ конфиги.

Что важно запомнить

Переменная окружения — пара имя-значение, которую процесс наследует от родителя; через неё передают конфиг приложению.

export помечает переменную для передачи потомкам; без него дочерний процесс её не увидит. VAR=value команда задаёт переменную разово.

Конфиг держат в окружении (.env, -e, env_file), чтобы один образ работал везде, а секреты не лежали в коде. .env с секретами в git не коммитят.

В следующем уроке разберём диск: куда уходит место и как искать виновника.

Прошли материал до конца? Отметьте урок пройденным.