Дождитесь запуска отдельного контейнера - PullRequest
1 голос
/ 28 мая 2019

Я использую docker-py , чтобы помочь написать довольно сложные тесты BDD через Поведение .

Я использую containers.run с detach=True, так как янужно иметь возможность продолжить мой сценарий.Шаг Given создает контейнер, который затем используется шагом when, чтобы сделать что-то внутри него, и, наконец, как и ожидалось, шаг then подтверждает, что все было сделано правильно.

Однако,Я не могу понять, как заставить мой код ждать, пока контейнер Docker будет готов к приему данных / команд.На данный момент у меня есть ужасный sleep(60), который явно является неправильным способом сделать это .

Как я могу ждать, пока контейнер будет готов?

1 Ответ

2 голосов
/ 28 мая 2019

Если ожидаемый контейнер запускает службу, которая может четко сообщать о своем состоянии внешнему миру (например, базе данных, которая отклоняет или принимает подключения), то вы можете легко встроить некоторую функциональность try-catch в свои тесты, чтобыпроверьте, готов ли контейнер до начала испытаний.

Однако, если такого не происходит, вы не сможете многое сделать, кроме sleep, потому что (с точки зрения Докера) контейнер может быть готов доОсновной процесс внутри него готов (опять же, контейнер базы данных может быть полностью запущен до того, как процесс БД внутри него будет готов принимать соединения, и Docker не сможет ничего с этим поделать).

Возможный подход заключается в определенииновый ENTRYPOINT для контейнера, который вы ждете, помещает куда-то файл, который могли бы найти ваши тесты.Если файл там, тесты могут начаться, в противном случае sleep(1) и посмотреть снова.Пример для entrypoint.sh (не проверено):

#!/bin/sh

set -e

# run the process you need here

touch /tmp/i-am-ready

exec "$@"

Ваши тесты могут либо проверить этот файл непосредственно в контейнере, либо смонтировать его где-нибудь как том.Вы также должны убедиться, что после вещи touch все еще есть прикрепленный процесс, иначе ваш контейнер, вероятно, exit 0.

...