Как сделать так, чтобы docker-compose завершил работу с ошибкой, если какая-либо из ее служб завершится с ошибкой?

avatar
EPeterson
1 июля 2021 в 17:38
94
1
0

Проблема

Как заставить docker-compose up выйти с ошибкой, если любой его сервис/контейнер завершается с ошибкой? Существует флаг --abort-on-container-exit, но он всегда завершается с кодом выхода 0. Существует также аргумент --exit-code-from <my_service>, но он завершится только с кодом выхода, с которым был завершен <my_service>.

Альтернативная форма того же вопроса: как узнать, что какой-либо контейнер докеров, запущенный предыдущей командой docker-compose up, завершился с ошибкой?

Нестандартное решение

Я придумал одно решение, в котором вы отслеживаете stdout, заданное docker-compose, и выполняете grep для экземпляров строки <service> exited with error code <code>, но я думаю, что этот подход подвержен ложным срабатываниям, а также вводит внешнюю зависимость. Мне интересно, есть ли лучший способ.

Источник
EPeterson
1 июля 2021 в 21:36
0

Большое спасибо за ваш ответ @Raphael! Я пытаюсь что-то написать. В частности, я использую docker-compose для выполнения тестов в среде CI. Я хочу провалить задание тестирования CI, если какой-либо контейнер завершится с ошибкой. Мне нравится, как вы упомянули docker ps --filter. Я потенциально мог бы использовать это и проанализировать коды выхода, но я думаю, что docker ps --filter перечисляет все мертвые/вышедшие контейнеры докеров, а не только те, которые были из самого последнего выполнения docker-compose.

Ответы (1)

avatar
Raphael PICCOLO
1 июля 2021 в 20:53
0

Вы пытаетесь написать что-то в сценарии или просто запускаете все и получаете отзывы?

например, вы можете запустить все свои контейнеры с

docker-compose up -d

затем выполните эту команду, чтобы увидеть мертвые контейнеры.

docker ps --filter status=dead
docker ps --filter status=exited

Возможные состояния: создано, перезапущено, запущено, удалено, приостановлено, завершено и мертво

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

.