#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
Подробные сведения: