| Навигация
|
Docker ARG, ENV и .env — полное руководствоDocker ARG, ENV и .env — полное руководство
Разберем разницу между ENV и ARG в Dockerfile и покажу, как их использовать.
ARG
Назначение: переменные для времени сборки образа (build-time).
Особенности:
доступны только в процессе сборки образа;
не сохраняются в финальном образе (не будут видны в запущенном контейнере);
позволяют параметризовать сборку — передавать разные значения при каждом запуске docker build;
могут иметь значения по умолчанию.
Синтаксис:
ARG <имя_переменной>[=<значение_по_умолчанию>]
Пример:
ARG NODE_VERSION=18
FROM node:${NODE_VERSION}-alpine
Передача значения при сборке:
docker build --build-arg NODE_VERSION=20 -t my-app .
ENV
Назначение: переменные окружения для времени работы контейнера (runtime).
Особенности:
устанавливаются при создании образа и сохраняются в нём;
доступны как во время сборки, так и в запущенном контейнере;
могут быть переопределены при запуске контейнера;
подходят для постоянной конфигурации приложения.
Синтаксис:
ENV <ключ>=<значение>
Пример:
ENV APP_HOME=/app
ENV LOG_LEVEL=info
ENV PORT=8080
Можно задать несколько переменных в одной строке:
ENV APP_HOME=/app LOG_LEVEL=info PORT=8080
Совместное использование ARG и ENV
Часто ARG используют для приёма параметров сборки, а ENV — для сохранения нужных значений в образе.
Пример Dockerfile:
docker build \
--build-arg BUILD_ENV=production \
--build-arg APP_VERSION=2.1.0 \
-t my-app:latest .
Запуск контейнера:
docker run my-app:latest
# Вывод: Running in production environment, version 2.1.0
Ключевые различия
Практические советы
Для чувствительных данных не используйте ARG или ENV в Dockerfile — передавайте их через секреты Docker или внешние системы управления конфигурацией.
Всегда указывайте значения по умолчанию для ARG, чтобы сборка не падала, если параметр не передан.
Группируйте связанные переменные ENV для лучшей читаемости:
# Database configuration
ENV DB_HOST=localhost DB_PORT=5432 DB_USER=app_user
# Application configuration
ENV APP_PORT=8080 APP_LOG_LEVEL=info
Документируйте переменные в комментариях к Dockerfile:
# APP_ENV: Application environment [development\|production] (default: development)
# LOG_LEVEL: Logging verbosity [debug\|info\|warn\|error] (default: info)
ENV APP_ENV=development LOG_LEVEL=info
Краткий итог
Используйте ARG, если значение нужно только для сборки (например, версия базового образа, флаги компиляции).
Используйте ENV, если переменная нужна приложению в работающем контейнере (порты, уровни логирования, пути).
Комбинируйте ARG и ENV, если нужно принимать параметры сборки и сохранять их как переменные окружения.
Разберем вопрос про работу с Dockerfile и файлами .env — пошагово и с примерами
1. Что такое Dockerfile и .env
Dockerfile — скрипт с инструкциями для сборки Docker‑образа (например, выбор базового образа, копирование файлов, установка переменных окружения, запуск команд).
.env — текстовый файл для хранения пар «ключ‑значение» (переменных окружения), который можно подгрузить в контейнер.
Упрощает управление конфигурацией, особенно когда переменных много.
2. Как задать переменные окружения в Dockerfile
В Dockerfile используют две инструкции:
ARG — переменные времени сборки.
Доступны только во время docker build, не сохраняются в итоговом образе и не видны контейнеру при запуске.
Подходят для передачи параметров сборки (версия пакета, флаг отладки).
ENV — переменные среды.
Устанавливаются на этапе сборки и сохраняются в образе.
Доступны и во время сборки, и при запуске контейнера.
Подходят для конфигурации приложения (порт, режим работы).
Пример Dockerfile:
FROM python:3.9-slim
# ARG — для параметров сборки
ARG APP_VERSION=1.0.0
ARG DEBUG_MODE=false
# ENV — для конфигурации приложения
ENV APP_NAME="MyApp"
ENV APP_PORT=8000
ENV DATABASE_URL="sqlite:///db.sqlite3"
# Используем ARG в команде сборки
RUN echo "Building version $APP_VERSION with debug $DEBUG_MODE"
WORKDIR /app
COPY . .
CMD ["python", "app.py"]
3. Как использовать .env файл
Файл .env выглядит так:
APP_PORT=8080
DATABASE_URL=postgresql://user:pass@db:5432/mydb
LOG_LEVEL=debug
Способы подгрузки переменных из .env
docker run --env-file .env
При запуске контейнера явно указываете файл:
docker run --env-file .env my-app-image
Контейнер получит переменные APP_PORT, DATABASE_URL и LOG_LEVEL с указанными в файле значениями.
Docker Compose
Это самый удобный способ для сложных приложений с несколькими контейнерами.
В docker-compose.yml укажите путь к .env:
version: '3.8'
services:
web:
image: my-app-image
env_file:
- .env
ports:
- "${APP_PORT}:${APP_PORT}"
Здесь Docker Compose автоматически подгрузит переменные из .env и использует их для подстановки значений (например, ${APP_PORT}).
docker build --build-arg + ARG в Dockerfile
Если нужно передать значения из .env на этапе сборки, придётся сделать это вручную (Docker не читает .env при сборке автоматически):
export $(cat .env | xargs) && docker build --build-arg APP_VERSION=$APP_VERSION -t my-app .
Этот способ менее распространён и требует предварительной подготовки окружения.
4. Как переопределить переменные
Значения переменных можно менять на разных этапах
При сборке (ARG):
docker build --build-arg APP_VERSION=2.0.0 -t my-app .
При запуске контейнера (ENV):
# Переопределить одну переменную
docker run -e APP_PORT=9000 my-app-image
# Переопределить несколько переменных
docker run -e APP_PORT=9000 -e LOG_LEVEL=info my-app-image
Флаг -e (или --env) переопределяет значение ENV, заданное в Dockerfile.
5. Важные нюансы и лучшие практики
Безопасность. Не храните секреты (пароли, API‑ключи) в Dockerfile (они попадут в образ и будут видны через docker history).
Для секретов используйте:
Docker Secrets (в Swarm);
внешние системы управления секретами (HashiCorp Vault, AWS Secrets Manager);
.env.local (для разработки) или docker-compose.override.yml, которые не коммитятся в Git.
Порядок инструкций.
Если используете ARG для установки ENV, убедитесь, что ARG объявлен до ENV:
ARG DB_HOST
ENV DATABASE_URL=postgresql://$DB_HOST:5432/db
Значения по умолчанию.
Всегда указывайте значения по умолчанию для ARG и ENV, чтобы контейнер мог запуститься без внешних настроек:
ARG APP_PORT=8000
ENV APP_PORT=$APP_PORT
Документация.
Добавьте комментарии в Dockerfile или README, описывающие все используемые переменные, их назначение и допустимые значения.
Краткий итог
Инструмент Когда использовать Сохраняется в образе? Доступно при запуске?
ARG Параметры сборки (версия, флаги) Нет Нет
ENV Конфигурация приложения (порты, URL БД) Да Да
.env Удобное хранение множества переменных окружения — Да (при подгрузке)
Рекомендуемый рабочий процесс:
Определите, какие настройки нужны вашему приложению (порт, БД, режим).
Для постоянных настроек используйте ENV в Dockerfile с разумными значениями по умолчанию.
Для параметров сборки используйте ARG.
Для хранения конфигурации создайте файл .env.
Для запуска контейнеров используйте Docker Compose с указанием env_file, чтобы легко управлять переменными и масштабировать приложение.
Комментарии пользователей Эту новость ещё не комментировалиНаписать комментарий Анонимам нельзя оставоять комментарии, зарегистрируйтесь! |
| Контакты Группа ВК | Видео к IT статьям на YoutubeВидео на другие темы Смотреть | ||||
Мои друзья: ![]() |
© Snakeproject.ru создан в 2013 году.При копировании материала с сайта - оставьте ссылку.Весь материал на сайте носит ознакомительный характер,за его использование другими людьми, автор ответственности не несет. |
||||
Поддержать автора и проект
|
|||||