Docker .py как остановить контейнер с помощью stdin_open = True? - PullRequest
4 голосов
/ 29 апреля 2020

Существует следующий код:

import docker
client = docker.from_env()
container = client.containers.create("ubuntu", stdin_open=True)
container.start()
container.stop()

Опция stdin_open должна быть установлена ​​на True. Операции stop выполняются за 10 секунд (сначала отправляется SIGTERM, в случае неудачи через 10 секунд отправляется SIGKILL). Похоже, что SIGTERM игнорируется. Как правильно остановить контейнер с stdin_open, установленным на True?

1 Ответ

1 голос
/ 29 апреля 2020

Это потому, что PID 1 не похож на systemd и не обрабатывает SIGTERM / SIGINT, как вы ожидаете. При нормальных обстоятельствах процесс выполняется при PID> 1, а PID 1 обрабатывает системные сигналы. Контейнер имеет не systemd, работающий с PID 1, а точку входа. Теперь, когда что-то еще вступило во владение (точка входа) и является PID 1, они несут ответственность за обработку системных сигналов. Это должно быть запрограммировано, чтобы сделать это явно.

У вас есть предупреждение об этом в документах .

Решением для этого является использование что-то вроде tini , которое функционирует как действительный процесс PID 1. В частности, обрабатывает SIGINT / SIGTERM в вашем случае и не потребует 10 секунд для SIGKILL.

...