Дождитесь docker -композиции для запуска перед запуском другого процесса - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть приложение, которое использует docker -compose и maven для запуска интеграционных тестов. Это приложение работает локально, когда я могу контролировать, когда выполнять команды. Сначала я запускаю docker-compose up и жду, пока все не будет сделано. Затем я открываю другое окно и запускаю интеграционные тесты для docker -композитного контейнера, который мы только что развернули: mvn verify -P integration-test -DBASE_URL=http://localhost:8080

Однако, когда я запускаю в gitlab, я не знаю, как дождитесь запуска команды mvn, пока контейнер не раскрутится. Кто-нибудь знает, как я могу это сделать (имейте в виду, что я думаю, что я должен запустить docker -compose up -d в gitlab, иначе он блокирует бегун). Журналы ошибок, которые я вижу: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:8080/health": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

Полный вывод gitlab можно найти здесь: https://gitlab.com/connorbutch/trading-app/-/jobs/524923294

Спасибо, Коннор

1 Ответ

0 голосов
/ 24 апреля 2020

, если http://localhost:8080/health указывает на то, что тесты готовы к запуску, вы можете подождать, пока тест завершится успешно, прежде чем продолжить. Было бы естественно выполнить docker -compose и mvn из оболочки, поэтому я предоставлю bash здесь.

wait_for_health() {
  for i in $(seq 1 5); do 
    if curl -s 'http://localhost:8080/health'; then return 0; fi
    sleep 2
  done
  echo "localhost was never ready"
  exit 1
}

wait_for_health 

, если вы думаете об очистке, bash может запустить команда при выходе, может быть что-то вроде:

trap "docker-compose down" EXIT

Наконец, не забудьте запустить ваши сценарии с установленным -e. Вы можете поместить его в shebang #!/bin/bash -e или set -e, но если вы не установите -e, сбойные команды, нелогично, не вызовут сбой скрипта. Обычно это не то, что вы хотите.

В качестве альтернативы вы можете запустить mvn из docker -compose. Вам придется описать свою среду maven и вспомогательные компоненты в docker, но затем вы можете добавить контейнер, который зависит от веб-контейнера. Из того, что я могу сказать, вам решать, как не выполнять mvn локально в этом случае ( Можете ли вы определить дополнительные docker -композитные сервисы? выглядит так хорошее начало), но это может помочь вам обработать зависимости контейнера.

...