состязание состязания состязания состязания при беге в CI - PullRequest
1 голос
/ 11 апреля 2019

У меня есть дымовой тест docker-compose, который я запускаю в CI .... когда две сборки одного и того же проекта выполняются одновременно, сборка обычно заканчивается неудачей.Я уверен, что сборки выполняются одновременно на одной машине с общим док-сокетом.похоже, что docker-compose пытается повторно использовать / обращаться к контейнерам из другого экземпляра и оказывается в каком-то состоянии гонки.

Я пробовал различные флаги для решения этой проблемы, но все равно получаю сбои.Текущие флаги: --exit-code-from smoke --remove-orphans --force-recreate using --exit-code-from implies --abort-on-container-exit

Как сохранить эти два экземпляра сборочных контейнеров изолированными друг от друга?

Вот пример ошибки:

+ make smoke
ls: /var/lib/docker/volumes/0_3542251907521744511_default/_data: No such file or directory
ls: '/var/lib/docker/volumes/0_3542251907521744511_default/_data'/src/github.myco.com/viper-ace/psn-router/'}: No such file or directory
docker-compose version 1.23.2, build 1110ad0 docker-py version: 3.6.0 CPython version: 2.7.15 OpenSSL version: LibreSSL 2.7.4
docker-compose -f smoke-test/docker-compose.yaml up --exit-code-from smoke --remove-orphans --force-recreate
using --exit-code-from implies --abort-on-container-exit
Recreating mock-maker ... 
Recreating mock-maker ... done
Recreating psn-router ... 
Recreating psn-router-500 ... 
Recreating psn-router-500 ... done
Recreating psn-router     ... done
Recreating smoke          ... 
Attaching to mock-maker, psn-router-500, psn-router, smoke
mock-maker                 | > mock-maker@0.1.0 start /usr/src/app
psn-router-500             | 2019-04-11T16:36:21.411Z level=INFO, code=0000, src=psn-router/server.go:87, s=psn-router, hostname=psn-router-instance, c=UNKNOWN, site=UNKNOWN, m="Listen and Serve: http://127.0.0.1:8080"
mock-maker                 | > node mock-maker.js
psn-router                 | 2019-04-11T16:36:21.441Z level=INFO, code=0000, src=psn-router/server.go:87, hostname=psn-router-instance, c=UNKNOWN, site=UNKNOWN, s=psn-router, m="Listen and Serve: http://127.0.0.1:8080"
mock-maker                 | MockMaker app listening at http://:::80
Unexpected API error for psn-router (HTTP code 404)
Response body:
{"message":"No such container: 89460559a3e81a230f5647d52997c5b05bf94f3bdc8e268ca9654d3945ca675d"}
Recreating smoke          ... done
Stopping psn-router-500   ... 
Stopping mock-maker       ... 
Stopping psn-router-500   ... done
Stopping mock-maker       ... done
No such container: 8dec60de6fb3657c0a70e9d53aa27e385b9bd50c24e6cb332d1a7cc373bb7afa
Aborting on container exit...
make: *** [Makefile:22: smoke] Error 

- это файл docker-compose:

services:
  mock-maker:
    container_name: "mock-maker"
    image: registry.myco/viper-ace/mock-maker:0.11.0
  psn-router-500-endpoint:
    container_name: "psn-router-500"
    image: "${DOCKER_IMAGE}"
    depends_on:
      - mock-maker
    environment:
      - ENDPOINT= http://mock-maker/endpoint500 
  psn-router:
    container_name: "psn-router"
    image: "${DOCKER_IMAGE}"
    depends_on:
      - mock-maker
    environment:
      - ENDPOINT= http://mock-maker/endpoint200 
  smoke:
    container_name: "smoke"
    image: registry.myco/http-blackbox-test-tool:2.0.2
    depends_on:
      - psn-router
    volumes:
       - ${SMOKE_TEST_DIR}:/smoke-test
    environment:
      - TEST_DIR=/smoke-test

make target:

smoke:
    @echo $(shell docker-compose version)
    SMOKE_TEST_DIR=$(CODE_DIR)/smoke-test DOCKER_IMAGE=${DOCKER_IMAGE} docker-compose -f smoke-test/docker-compose.yaml up --exit-code-from smoke --remove-orphans --force-recreate

1 Ответ

1 голос
/ 11 апреля 2019

Проблема, с которой вы сталкиваетесь, связана с тем, что 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.стр.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...