Как изящно закрыть сервер, работающий в докере
Я запускаю 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 в качестве первого процесса, супервизор будет управлять другими процессами и передавать им сигналы.