Как изящно закрыть сервер, работающий в докере

Я запускаю mongodb через конфигурацию ENTRYPOINT в файле докеров. Он работает нормально. Однако, когда я выполняю:

docker stop <containerid>

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

Ответы

Ответ 1

Я не уверен, что понял. docker stop <id> действительно отправит SIGTERM. Это по дизайну. Если процесс не завершился корректно в течение таймаута (по умолчанию 10 секунд), выдается SIGKILL.

На данный момент у нас есть некоторые проблемы с распространением сигнала. Это связано с пространством имен pid и тем фактом, что процесс имеет pid 1. Это должно быть исправлено в ближайшее время с новыми плагинами выполнения.

Ответ 2

Я использую docker 0.9. SIGTERM будет отправлен для обработки с PID = 1 внутри контейнера при остановке док-станции. Таким образом, мы можем управлять подпроцессами с помощью supervisord, runit.

Проблема заключается в том, что мы вызываем $service docker stop | restart или хост-машину reset. Docker не отправит SIGTERM ко всем работающим контейнерам. Я пытаюсь решить этот случай.

Ответ 3

Используя Docker 0.9 или новее, он по умолчанию отправит SigTerm в первый процесс (который запущен внутри контейнера).

Но обратите внимание, что файл переменной окружения (/etc/default/docker в Ubuntu и /etc/sysconfig/docker в CentOS) должен включать DOCKER_OPTS = "-r = false" (или other_args = "-r = false" в CentOS) для остановки докера из контейнера autorestart.

Например, я использую эту конфигурацию: DOCKER_OPTS = "-g/mydir/docker -r = false --dns 8.8.4.4"

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