Прямо сейчас наши агенты Jenkins генерируют docker-compose.yml для каждого из наших проектов Rails, а затем запускают docker-compose up. Docker-compose.yml имеет основной «веб-контейнер», внутри которого находится rbenv и все другие наши зависимости Rails. Он связан с контейнером БД, который содержит тестовую БД Postgres.
Проблема возникает, когда нам действительно нужно запустить тесты и сгенерировать коды выхода. Наш CI-сервер будет развернут только в том случае, если тестовый сценарий вернет exit 0, но docker-compose всегда возвращает 0, даже если одна из команд контейнера не работает.
Другая проблема заключается в том, что контейнер БД работает бесконечно, даже после того, как веб-контейнер завершил выполнение тестов, поэтому docker-compose up
никогда не возвращается.
Есть ли способ использовать docker-compose для этого процесса? Нам нужно будет иметь возможность запускать контейнеры, но выходить после завершения веб-контейнера и возвращать его код выхода. Прямо сейчас мы застряли вручную, используя докер, чтобы развернуть контейнер БД и запустить веб-контейнер с параметром --link.
источник
docker-compose
1.12.0 и выше. Может быть, это и ваш случай. Примером может быть:docker-compose up --exit-code-from test-unit
. Обратите внимание, что у меня это не сработало, пока я не добавилset -e
в начало своего скрипта.--exit-code-from
не работает,-d
хотя. Он выдаст следующие ошибки:using --exit-code-from implies --abort-on-container-exit
и--abort-on-container-exit and -d cannot be combined.
docker-compose run
это простой способ получить желаемый статус выхода. Например:Кроме того, у вас есть возможность осмотреть мертвые контейнеры. Вы можете использовать
-f
флаг, чтобы получить только статус выхода.Что касается контейнера db, который никогда не возвращается, если вы его используете,
docker-compose up
вам нужно будет удалить этот контейнер; вероятно, это не то, что вы хотите. Вместо этого вы можете использоватьdocker-compose up -d
для запуска своих контейнеров демонизированные и вручную уничтожить контейнеры, когда ваш тест будет завершен.docker-compose run
должен запускать связанные контейнеры для вас, но я слышал болтовню о SO об ошибке, мешающей этому работать, как задумано прямо сейчас.источник
docker-compose logs
-T
Основываясь на ответе Кодзиро:
docker-compose ps -q | xargs docker inspect -f '{{ .State.ExitCode }}' | grep -v '^0' | wc -l | tr -d ' '
Возвращает количество возвращенных кодов выхода, отличных от 0. Было бы 0, если бы все вышло с кодом 0.
источник
docker-compose ps
, например:docker-compose ps | grep -c "Exit 1"
даст вам счетчик, на котором совпадает «Выход 1» в отображении изdocker-compose ps
(что обеспечивает красиво напечатанную сводную таблицу результатов). Коды выхода перечислены в столбце «Состояние».Если вы хотите запускать
docker-compose run
тесты вручную, добавление--rm
флага, как ни странно, заставляет Compose точно отражать статус выхода вашей команды.Вот мой пример:
источник
(docker-compose run --rm ...) || exit $?
для прекращения в случае ошибки. Полезно в сценариях bash.Используйте,
docker wait
чтобы получить код выхода:foo
это «название проекта». В приведенном выше примере я указал его явно, но если вы его не укажете, это имя каталога.bar
- это имя, которое вы даете тестируемой системе в вашем docker-compose.yml.Обратите внимание, что это
docker logs -f
тоже правильно, выходя, когда контейнер останавливается. Итак, вы можете поставитьмежду
docker-compose up
и,docker wait
чтобы вы могли наблюдать за выполнением тестов.источник
--exit-code-from SERVICE
и--abort-on-container-exit
не работают в сценариях, когда вам нужно запустить все контейнеры до завершения, но не работают, если один из них завершился раньше. Примером может быть одновременное выполнение двух тестовых костюмов в разных контейнерах.С помощью предложения @spenthil вы можете обернуть
docker-compose
сценарий, который завершится ошибкой, если это произойдет с какими-либо контейнерами.Затем на вашем CI-сервере просто измените
docker-compose up
на./docker-compose.sh up
.источник
docker-rails позволяет вам указать, какой код ошибки контейнера возвращается в основной процесс, чтобы ваш CI-сервер мог определить результат. Это отличное решение для CI и разработки рельсов с докером.
Например
в вашем
docker-rails.yml
дастweb
код выхода контейнера в результате командыdocker-rails ci test
.docker-rails.yml
- это просто мета-оболочка вокруг стандарта,docker-compose.yml
которая дает вам возможность наследовать / повторно использовать одну и ту же базовую конфигурацию для разных сред, например, разработка vs test vs parallel_tests.источник
В случае, если вы можете запустить больше служб для создания докеров с тем же именем на одном движке докеров, и вы не знаете точное имя:
echo %?
- возвращает код выхода из сервиса test-chromeЛьготы:
источник
Вы можете увидеть статус выхода с помощью:
echo $(docker-compose ps | grep "servicename" | awk '{print $4}')
источник
docker-compose ps | grep servicename | grep -v 'Exit 0' && echo "Automation or integration tests failed." && exit 1