Docker Compose: запуск команды и получение файлов - PullRequest
3 голосов
/ 06 ноября 2019

У меня есть настройка Docker, где у меня есть 20 различных сервисов, которые зависят друг от друга. Я пишу скрипт, который запускает тесты на контейнере с использованием docker-compose run my_service ....

, но у меня есть пара проблем с этим:

  1. После завершения тестов,они должны выводить как XML-файл с результатами теста, так и XML-файл с результатами покрытия. Я хочу, чтобы мой скрипт, который вызывает docker-compose, имел доступ к обоим этим файлам. Это проблема, потому что, насколько мне известно, после запуска docker-compose run эти контейнеры закрываются. Единственное решение, которое я могу придумать, это запустить его с --entrypoint=tail -f /dev/null, затем выполнить тестовую команду и получить файл. Но это немного громоздко. Есть ли лучший способ?
  2. После окончания тестов я бы хотел остановить и удалить не только контейнер, на котором я выполнял тесты, но и все контейнеры, которые были запущены, потому что он зависел от них. Как я могу сделать это автоматически?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

После завершения тестов они должны вывести оба файла XML ...

Если основной функцией вашей задачи является чтение или создание файлов для локальной файловой системы, частолучше запустить его за пределами докера. В случае интеграционных тестов это даже довольно просто: вместо того, чтобы запускать тесты внутри контейнера Docker и указывать на конечные точки других контейнеров, запускайте тесты на хосте и указывайте на их опубликованные порты. Если ваша тестовая среда может запускать команды docker-compose, то вы можете запустить стек контейнеров в качестве тестового устройства.

Если по какой-то причине у них есть для запуска в Docker, то вы можете связатьсмонтировать каталог хоста в контейнер для получения файлов результатов. docker-compose run поддерживает дополнительные -v тома монтирования, так что вы должны иметь возможность запускать что-то вроде

docker-compose run -v $PWD/my_service_tests:/output my_service ..

Я бы хотел остановить и удалить не толькоконтейнер, на котором я выполнял тесты, но все контейнеры, которые были запущены, потому что он зависел от них.

Я не думаю, что в Docker Compose есть такая опция;это не , что умный. Рассмотрим случай, когда два разных теста выполняются одновременно, каждый из которых запускает отдельный тестовый контейнер, но совместно использует контейнер базы данных. Первый тест не может остановить контейнер базы данных, потому что второй тест использует его, но Compose действительно не знает об этом.

Если вы не возражаете запускать полный изолированный стек для каждого запуска теста,тогда вы можете использовать опцию docker-compose -p, чтобы сделать это. Затем вы можете использовать docker-compose rm для очистки всего, для этого конкретного теста.

docker-compose -p test1 run -v $PWD/test1:/output my_service ...
docker-compose -p test1 stop
docker-compose -p test1 rm
0 голосов
/ 07 ноября 2019
  1. После завершения испытаний они должны вывести как XML-файл с результатами теста, так и XML-файл с результатами покрытия. Я хочу, чтобы мой скрипт, который вызывает docker-compose, имел доступ к обоим этим файлам.

Вы можете записывать отчеты о тестировании в какую-то папку внутри контейнера. Эта папка может быть сопоставлена ​​с папкой на хосте Docker с использованием томов. Поэтому сценарий, выполняющий команды docker-compose, сможет их использовать.

Это сложная задача, поскольку, насколько я знаю, после запуска docker-compose эти контейнеры закрываются.

Они остановлены. Но при следующем запуске docker-compose они будут перезапущены с сохранением подключенных томов .

Примечание :

Компоновать кэшиКонфигурация используется для создания контейнера. При перезапуске службы, которая не изменилась, Compose повторно использует существующие контейнеры. Повторное использование контейнеров означает, что вы можете очень быстро вносить изменения в свою среду.

Это означает, что вы можете копировать файлы отчетов, сгенерированные тестовым сервисом, с помощью команд docker cp даже после выхода из контейнеров.

docker cp должно работать независимо от объема. Например, предположим, что тесты записали папку reports.xml в /test_reports внутри контейнера. Вы можете скопировать файл на хост, используя docker cp после остановки тестового контейнера.

Пример , Example2

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

Использование docker-compose down

Команда

Stops containers and removes containers, networks, volumes, and images created by up.

Команда будет работать, если вы определилитестируемая служба со всеми зависимыми службами и сама служба тестирования в одном и том же файле.

Пример использования

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