Приоритет переменных среды

Важно

С конца июня 2023 года Compose V1 больше не будет поддерживаться и будет удален из всех версий Docker Desktop.

Убедиться, что вы переключились на Compose V2 с помощью подключаемого модуля CLI docker compose или активировав параметр Использовать Docker Compose V2 в Docker Desktop. Для получения дополнительной информации см. Эволюция Compose.

Когда вы устанавливаете одну и ту же переменную среды в нескольких источниках, Compose использует правило приоритета. Он направлен на разрешение значения рассматриваемой переменной.

На этой странице содержится информация об уровне приоритета каждого метода установки переменных среды.

Порядок старшинства (от высшего к низшему) следующий:

  1. Устанавливает с помощью docker compose run -e в CLI

  2. Замена из вашей оболочки

  3. Устанавливает с помощью атрибута файл environment в Compose

  4. Использование –env-file аргумент в CLI

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

  6. Устанавливает с помощью .env-файл, размещенного в базе каталога вашего проекта

  7. Установить в образ контейнера в директива ENV. Наличие любого параметра ARG или ENV в Dockerfile оценивается только в том случае, если нет записи Docker Compose для environment, env_file или run --env.

Простой пример

В приведённом далее примере мы устанавливаем разные значения для одной и той же переменной среды в файле .env и с атрибутом environment в файле Compose:

$ cat ./Docker/api/api.env
NODE_ENV=test

$ cat docker-compose.yml
services:
  api:
    image: 'node:6-alpine'
    env_file:
     - ./Docker/api/api.env
    environment:
     - NODE_ENV=production

Переменная среды, определенная с помощью атрибута environment, имеет приоритет.

$ docker compose exec api node

> process.env.NODE_ENV
'production'

Примечание

Переменные жесткого кодирования в сценариях контейнеров

Выполнение команды внутри контейнера, которая безоговорочно устанавливает значение переменной, имеет приоритет над любым параметром в вашем файле docker-compose.yml.

Например, в проекте NodeJS, если у вас есть запись package.json для scripts.start, например NODE_ENV=test node server.js, любое значение, заданное для NODE_ENV в файле Compose, игнорируется при запуске npm run start в контейнере.

Расширенный пример

В следующей таблице в качестве примера используется переменная среды TAG, определяющая версию образа.

Как работает таблица

Каждый столбец представляет собой контекст, из которого вы можете установить значение или заменяет значение на TAG.

Столбцы Host OS environment и .env file указаны только в качестве иллюстрации. На самом деле они сами по себе не приводят к созданию переменной в контейнере.

Каждая строка представляет собой комбинацию контекстов, где TAG установлен, заменен или и то, и другое.

#

docker compose run --env

Атрибут environment

Атрибут env_file

Образ ENV

Окружающая среда Host OS

файл .env

Результат

1

TAG=1.4

TAG=1.3

2

TAG=1.5

TAG=1.4

TAG=1.3

TAG=1.5

3

TAG

TAG=1.5

TAG=1.4

TAG=1.3

TAG=1.4

4

TAG

TAG=1.5

TAG=1.3

TAG=1.3

5

TAG

TAG=1.5

ТЕГ=1.3`

TAG=1.3

6

TAG=1.8

TAG=1.5

TAG=1.4

TAG=1.3

TAG=1.8

7

TAG

TAG=1.5

TAG=1.4

TAG=1.3

TAG=1.4

8

TAG

TAG=1.7

TAG=1.5

TAG=1.4

TAG=1.3

TAG=1.4

9

TAG=1.8

TAG=1.7

TAG=1.5

TAG=1.4

TAG=1.3

TAG=1.8

10

TAG=1.8

TAG=1.6

TAG=1.5

TAG=1.4

TAG=1.3

TAG=1.8

11

TAG=1.8

TAG=1.7

TAG=1.6

TAG=1.5

TAG=1.4

TAG=1.3

TAG=1.8

12

TAG=1.6

TAG=1.5

TAG=1.4

TAG=1.6

13

TAG=1.7

TAG=1.5

TAG=1.4

TAG=1.7