docker-compose интерполирует переменные среды: используйте переменные по умолчанию, предоставляемые docker-compose

#docker #docker-compose #environment-variables #interpolation #substitution

Вопрос:

Мне нужна помощь со следующим шаблоном:

 services:

nginx:
  image: nginx
  restart: unless-stopped
  labels:
    - "traefik.enable=true"
    - "traefik.http.routers.nginx-${COMPOSE_PROJECT_NAME}.rule=Host(`fuu.bar`)"
  networks:
    - treafik
 

Моя цель-создать шаблон, который я могу использовать, например, в portainer с почти нулевой конфигурацией.

Я думал, что в конфигурации docker-compose доступны следующие переменные, но выражение ${COMPOSE_PROJECT_NAME} приводит к пустой строке: docker-compose config

 services:

nginx:
  image: nginx
  restart: unless-stopped
  labels:
    - "traefik.enable=true"
    - "traefik.http.routers.nginx-.rule=Host(`fuu.bar`)"
  networks:
    - treafik
 

Существуют ли какие-либо переменные среды по умолчанию, предоставляемые docker-compose, которые я могу использовать для интерполяции среды?

—- Обновление

Я использую traefik (v2) в качестве обратного прокси-сервера. Чтобы сделать контейнеры доступными через treafik, вам необходимо определить маршрутизаторы для каждой службы. Имя маршрутизатора должно быть уникальным. Давайте представим, что вы развертываете 2 или более стеков вышеприведенного шаблона. Имя маршрутизатора должно быть уникальным для всех служб во всех стеках. Поскольку я ленивый парень, я попытался просто интегрировать переменную среды COMPOSE_PROJECT_NAME (которая, как я знаю, уже уникальна в моей настройке, потому что каждый стек должен иметь уникальное имя). Но переменная недоступна при развертывании стека. Конечно, я мог бы просто определить переменную COMPOSE_PROJECT_NAME самостоятельно в a .env-файл, но я надеялся, что в docker есть какие-либо переменные среды по умолчанию.

Ответ №1:

Вы можете использовать переменные среды для передачи строк в файл настройки. Существует множество способов использования документации docker. Например:

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

  • Начиная с 1.1.8, файл.env помещается в базу каталога проекта
  • Каталог проекта может быть явно определен с помощью параметра —file или переменной среды COMPOSE_FILE. В противном случае это текущий рабочий каталог, в котором выполняется команда docker compose ( 1.28).
  • В предыдущих версиях могли возникнуть проблемы с разрешением файла .env с помощью —file или COMPOSE_FILE. Чтобы обойти это, рекомендуется использовать —project-directory, который переопределяет путь к файлу .env. Это несоответствие устранено в версии v1.28 путем ограничения пути к файлу каталогом проекта.

Комментарии:

1. Извините, я думаю, что мое описание было недостаточно ясным. Я знаю о механизме .env-файла.

2. Вы протестировали все решения в документации docker и не сработали? даже --env-file вариант?

3. Извините, нажимаю быстро на ввод. Я обновил свое описание выше, чтобы (надеюсь) сделать его более понятным, чего я пытаюсь достичь. Да, я тестирую несколько переменных среды, таких как COMPOSE_PROJECT_NAME и COMPOSE_FILE т. Д. Но я думаю, что есть только возможность настроить поведение docker-compose, и по умолчанию они недоступны для интерполяции среды (кроме того, я определяю их сам).