Не то, что я пытался сделать раньше, но ... демон Docker генерирует события, когда происходят определенные вещи.Вы можете увидеть некоторые из них в https://docs.docker.com/engine/reference/commandline/events/#parent-command, но, например:
Контейнеры Docker сообщают о следующих событиях:
присоединить коммит копию создать уничтожить отсоединить exec_create exec_detach exec_startэкспорт health_status kill oom pause переименовать resize перезапустить start stop top top unpause update
По умолчанию на одном хосте докера вы можете общаться с демоном через сокет unix /var/run/docker.sock
.Вы также можете связать этот сокет Unix с контейнером, чтобы вы могли перехватывать события внутри контейнера.Вот простой docker-compose.yml
, который делает это:
version: '3.2'
services:
container_a:
image: nginx
container_name: container_a
container_b:
image: docker
container_name: container_b
command: docker events
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
Запустите этот стек с docker-compose up -d
.Затем в одном терминале запустите docker logs -f container_b
.В другом терминале запустите docker restart container_a
, и вы увидите некоторые события в окне журнала, которые показывают перезапуск контейнера.Ваше приложение может перехватить эти события, используя клиентскую библиотеку Docker, а затем либо завершить себя и дождаться перезапуска, либо каким-либо иным образом организовать перезапуск или реконфигурацию.
Обратите внимание, что эти события фактически сообщат вам идентификатор нового контейнера, поэтомуможет быть, вам даже не нужно перезапускать?