Одна и та же служба компоновки docker в нескольких папках

#docker #docker-compose

#докер #docker-создать

Вопрос:

У меня есть пакет ( bootstrap ), который включен в несколько локальных проектов. Пример:

 project1/:
    src/...
    tests/...
    vendor/bootstrap/...

project2/:
    src/...
    tests/...
    vendor/bootstrap/...
 

В этом пакете есть свои внутренние тесты и статические анализаторы кода, которые я хочу запустить внутри каждой projectX/vendor/bootstrap папки. Тесты и анализаторы запускаются из контейнеров docker. Т.е. bootstrap имеет docker-compose.yml некоторую конфигурацию:

 version: '3.7'
services:
  cli:
    build: docker/cli
    working_dir: /app
    volumes:
      - ./:/app
    tty: true
 

Проблема в том, что когда я запускаю что-то внутри project1/vendor/bootstrap , затем переключаюсь на project2/vendor/bootstrap и запускаю что-то там, docker думает, что я выполняю контейнеры из project1. Я полагаю, это из-за того, что имя папки совпадает с именем Docker Compose, которое генерирует имена контейнеров [folder-name_service-name] . Поэтому, когда я запускаю docker-compose exec cli sh , он проверяет, есть ли запущенный контейнер bootstrap_cli , но он может быть создан в другой bootstrap папке другого проекта.
Пример docker ps :

 CONTAINER ID        IMAGE            COMMAND                  CREATED             STATUS                PORTS        NAMES
128c3e834df4        bootstrap_cli    "docker-php-entrypoi…"   55 minutes ago      Up 55 minutes                      bootstrap_cli
 

NAMES то же самое для контейнеров во всех этих папках ProjectX.

Существует опция добавления container_name: bootstrap_project1_cli , но, похоже, Docker Compose игнорирует ее при поиске запущенного контейнера.

Итак, можно ли различать контейнеры с одинаковыми именами и иметь их все одновременно?

Ответ №1:

Взгляните на эту проблему github: https://github.com/docker/compose/issues/2120

Существует два варианта установки COMPOSE_PROJECT_NAME . Используйте флаг -p командной строки или переменную COMPOSE_PROJECT_NAME среды. Оба задокументированы здесь: https://docs.docker.com/compose/reference/overview/#compose-project-name

Когда вы запускаете docker-compose, ему требуется имя проекта для контейнеров. Если вы не укажете параметр -p, docker-compose ищет среду с переменным именем COMPOSE_PROJECT_NAME . Если оба параметра не установлены, по умолчанию используется текущий рабочий каталог. Вот какое у вас поведение.

Если вы не хотите добавлять параметр командной строки, вы можете указать переменную среды в своем .env файле внутри каталога вашего файла docker compose. См . https://docs.docker.com/compose/env-file /

Ответ №2:

docker-compose — это, по сути, просто оболочка вокруг командной строки docker. Она предоставляет некоторую базовую область видимости для служб внутри файла компоновки, добавляя к контейнерам (сетям и томам тоже) COMPOSE_PROJECT_NAME значение. Если не настроено по-другому, это значение соответствует имени каталога файла компоновки. Вы можете перезаписать это, установив соответствующие переменные среды. Простым решением было бы поместить .env файл в каталоги начальной загрузки, который содержит инструкцию типа

 COMPOSE_PROJECT_NAME=project1_bootstrap
 

что приведет к автоматически сгенерированным именам контейнеров, таким как, например project1_bootstrap_cli_1

Подробные сведения: