Проблема, с которой вы сталкиваетесь, связана с тем, что docker-compose
использует так называемое имя проекта, чтобы "связать" контейнеры с конкретным вызовом docker-compose
.
Вот что сказано в документации docker-compose
о названии проекта:
COMPOSE_PROJECT_NAME
Устанавливает имя проекта.Это значение добавляется вместе с именем службы в контейнер при запуске.Например, если ваш проект называется myapp и включает в себя две службы db и web, тогда Compose запускает контейнеры с именами myapp_db_1 и myapp_web_1 соответственно.
Установка этого параметра необязательна.Если вы не установите это, по умолчанию для COMPOSE_PROJECT_NAME будет указано базовое имя каталога проекта.См. Также параметр командной строки -p.
Таким образом, в вашем случае происходит следующее: если у вас есть две команды docker-compose
, пытающиеся одновременно запускаться на одном компьютере с использованием одного и того же каталога, они будуту обоих есть имя проекта: smoke_test
.
Это означает, что если два вызова make smoke
происходят одновременно, они оба увидят контейнеры с префиксом smoke_test
и попытаются управлять / воссоздать их так, как они считают, что они принадлежатдля них, когда на самом деле они не могут.
Решение:
Самым простым решением для вас будет указать уникальное имя проекта для каждого вызова make smoke
используя флаг --project-name
для docker-compose
.
Один из способов сделать это будет:
docker-compose --project-name $(data +'%s') -f smoke-test/docker-compose.yaml up --exit-code-from smoke --remove-orphans --force-recreate
Таким образом, каждый вызов docker-compose
будетего контейнеры изолированы от других одновременных вызовов make smoke
.
В качестве отступления, я думаю, что предпочтительным способом генерации уникальных имен проектов будет использование чего-то вроде номера сборки, а не времени Unix.стр.
Надеюсь, это поможет.