Как задать переменные окружения в Docker?

Docker - это универсальный инструмент, который обеспечивает единообразную среду разработки на разных платформах. Переменные окружения в Docker играют важную роль в настройке приложений внутри Docker-контейнера.

В этом гайде вы познакомитесь с основной информацией о переменных окружения Docker. Кроме того, вы узнаете, как задать переменные окружения Docker разными способами, в том числе задать или переопределить их через команды Docker CLI и Docker Compose, а также рассмотрите несколько лучших практик.

Что такое переменные окружения Docker?

Переменные окружения Docker - это заранее определённые значения, которые влияют на все приложения внутри контейнера. Они служат разным целям, например определяют поведение приложения, задают параметры конфигурации для Docker-образов и позволяют безопасно хранить конфиденциальную информацию, такую как учётные данные базы данных и API-ключи.

Эти переменные важны для повышения переносимости и гибкости контейнера. Используя переменные окружения, вы можете менять настройки в зависимости от среды развёртывания без повторной сборки образа. Это позволяет передавать конфигурацию во время выполнения, благодаря чему контейнер может работать в разных средах, а его общая переносимость повышается. Окружение контейнера задаётся только тогда, когда оно явно определено в конфигурации сервиса.

Как задать переменные окружения Docker в Dockerfile?

Dockerfile определяет все шаги, необходимые для сборки Docker-образа, и позволяет задавать два типа переменных:

ENV: Environment variables
ARG: Build-time variables

Переменные ENV

Переменные окружения, заданные с помощью ENV , применяются к любому контейнеру, созданному из образа. Формат задания переменной окружения в Dockerfile следующий:

ENV env_variable_name=value

Переменные ARG

Переменные времени сборки определяются с помощью ARG и могут передаваться во время сборки.

Ниже приведён пример Dockerfile, в котором используются переменные окружения:

# Use an official Node.js runtime as a parent image
FROM node:14

# Set environment variables
ENV NODE_ENV=production
ENV PORT=3000

# Set the working directory
WORKDIR /usr/src/app

# Copy package.json and package-lock.json
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy the rest of the application code
COPY . .

# Expose port 3000
EXPOSE 3000

# Run the app
CMD ["npm", "start"]

В этом примере NODE_ENV и PORT - это переменные окружения, заданные с помощью директивы ENV. Эти переменные будут доступны в любом контейнере, собранном из этого Dockerfile.

Просмотр переменных окружения Docker: просмотр и управление переменными в Docker-контейнере

Чтобы просмотреть переменные окружения, заданные в Docker-контейнере или образе, Docker предоставляет несколько способов отладки и проверки.

1. Использование команды docker inspect

Команда docker inspect позволяет просмотреть подробную информацию о контейнере или образе, в том числе переменные окружения Docker. Вот как её можно использовать:

docker inspect --format '{{.Config.Env}}' <containerId_or_imageId>

Замените <containerId_or_imageId> на фактический ID вашего контейнера или образа. Эта команда получает и отображает только переменные окружения Docker (Env) в отформатированном JSON-выводе. Это удобно, чтобы быстро проверить, какие переменные сейчас настроены в экземплярах Docker.

2. Использование команды docker exec

Другой способ просмотреть настроенные переменные окружения Docker - воспользоваться командой docker exec. Вот как это сделать:

docker exec <containerID> env

Замените <containerID> на ID вашего запущенного контейнера. Эта команда выполнит команду env внутри указанного контейнера и выведет список всех переменных окружения, которые в нём сейчас заданы.

Как задать переменные окружения Docker с помощью Docker Compose?

Использование CLI для задания переменных окружения Docker во время выполнения - не лучший вариант для многоконтейнерных приложений. Лучший подход - использовать файл docker-compose.yml для определения всех переменных окружения. Этот файл содержит все необходимые конфигурации для контейнеров, и вы можете применить их одной командой при запуске контейнеров. Чтобы задать переменные окружения в контейнере с помощью Docker Compose, нужно явно определить эти переменные в конфигурации сервиса. 

Есть два способа задать переменные окружения Docker с помощью Docker Compose:

1. Использование атрибута environment

В этом способе вы непосредственно определяете переменные окружения в файле docker-compose.yml с помощью атрибута environment. Например, у нас есть Node-приложение, работающее с базой данных MongoDB:

Файл Docker compose:

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
      - MONGO_URI=mongodb://mongo:27017/database_name
    depends_on:
      - mongo
  mongo:
    image: mongo:4.4
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
volumes:
  mongo-data:

2. Использование файла .env или атрибута env_file

В этом способе вы храните переменные окружения Docker в отдельном файле .env и ссылаетесь на этот файл в файле docker-compose.yml.

Вот файл .env:

PORT=3000
MONGO_URI=mongodb://mongo:27017/database_name

Файл Docker compose:

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    env_file:
      - .env
    depends_on:
      - mongo
  mongo:
    image: mongo:4.4
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
volumes:
  mongo-data:

Использование файла .env обеспечивает гибкость и удобство: вы можете использовать тот же файл с командой docker run --env-file ... или совместно использовать его в нескольких сервисах Docker Compose без дублирования длинных разделов с переменными окружения в вашей YAML-конфигурации.

Такой подход позволяет хранить переменные окружения отдельно от основного файла конфигурации, что улучшает организацию и безопасность. Не размещая файл .env непосредственно в корневом каталоге, вы можете лучше управлять конфиденциальной информацией. 

Атрибут env_file также поддерживает использование нескольких файлов .env в рамках Compose-приложения. Пути к этим файлам .env, указанные в атрибуте env_file, задаются относительно расположения вашего файла docker-compose.yml.

3. Задание переменных окружения Docker с помощью docker compose во время выполнения

Docker compose позволяет задавать переменные окружения Docker из командной строки с помощью параметра --env-file.

docker compose --env-file <environmental_variables_file> up

Теперь добавьте новую тестовую переменную окружения в файл .env.

MONGODB_PASSWORD=test

Запустите приложение и просмотрите настроенные переменные окружения Docker.

4. Использование Docker Compose для задания разовых переменных окружения Docker

При использовании docker compose run для задания переменных окружения для разового запуска контейнера вы можете указать эти переменные с помощью параметров -e или --env-file. Этот подход аналогичен docker run и позволяет переопределить или задать переменные окружения только для этого конкретного экземпляра контейнера. 

Например, чтобы изменить переменную DEBUG в контейнере вашего веб-приложения, выполните:

docker compose run -e DEBUG=0 web

Эта команда задаёт для переменной DEBUG значение 0 именно для сервиса/контейнера web во время этого запуска, адаптируя окружение под этот запуск.

Каковы лучшие практики задания переменных окружения Docker?

Задание переменных окружения Docker предполагает несколько лучших практик, обеспечивающих безопасность, согласованность и удобство сопровождения:

  • Используйте файл .env: храните переменные окружения в отдельном файле .env. Это помогает упорядочить переменные для разных сред (разработка, тестирование, продакшн). Обязательно добавьте файл .env в .gitignore, чтобы конфиденциальные данные не попали в систему контроля версий.
  • Шифруйте конфиденциальные данные: не храните конфиденциальную информацию, такую как пароли и API-ключи, в открытом виде. Вместо этого используйте шифрование для их безопасного хранения. Расшифровывайте эти переменные в приложении, когда это необходимо.
  • Избегайте изменений во время выполнения: не изменяйте переменные окружения в запущенном контейнере. Это обеспечивает согласованность между разными средами. Если изменения необходимы, остановите контейнер, внесите изменения и запустите новый экземпляр.
  • Соблюдайте стандартные правила именования: поддерживайте согласованность, используя стандартные правила именования переменных окружения. Так проще управлять ими и понимать их назначение.
  • Регулярно пересматривайте переменные: регулярно проверяйте и обновляйте переменные окружения Docker, чтобы они оставались актуальными. Удаляйте или обновляйте устаревшие переменные, чтобы сохранять понятность и эффективность.

Заключение

В этом гайде рассмотрена важность переменных окружения Docker для обеспечения согласованного поведения приложений на разных платформах. Мы обсудили, как определять эти переменные в Dockerfile и изменять их с помощью команд CLI и Docker Compose. Следуя лучшим практикам, вы можете безопасно управлять конфиденциальными данными, обеспечить согласованные конфигурации с помощью docker compose и повысить эффективность развёртывания.

BlueVPS.com.ua предлагает высокопроизводительные VPS-решения с доступностью на уровне облака, обеспечивая простую, масштабируемую и настраиваемую среду, идеальную для развёртываний Docker. Пользуйтесь выделенными ресурсами и неограниченным трафиком, оптимизируя ваши Docker-приложения для высокой производительности и беспрепятственного масштабирования.