Перезапуск приложения Docker контейнера контейнера приводит к «Это приложение уже запущено» - RUNNING_PID не удаляется
Редактировать: Есть связанная проблема, являющаясяобсуждали на Github но в другом режиме развертывания (пользовательский интерфейс Typesafe, а не Docker).
Я пытался смоделировать перезагрузку системы, чтобы проверить политику перезапуска Docker, которая объявляет о возможности перезапуска контейнеров в правильном порядке.
У меня есть приложение Play Framework, написанное на Java.
Dockerfile выглядит так:
FROM ubuntu:14.04
#
# [Java8, ...]
#
RUN chmod +x /opt/bin/playapp
CMD ["/bin/bash"]
Я начинаю это с помощью$ docker run --restart=always -d --name playappcontainer "./opt/bin/playapp"
.
Когда я$ service docker stop && service docker restart
а потом$ docker attach playappcontainer
консоль говорит мне:
Play server process ID is 7
This application is already running (Or delete /opt/RUNNING_PID file)
Редактировать: Тот же результат, когда я следую рекомендации документации Play дляизменить местоположение файла в /var/run/play.pid с-Dpidfile.path=/var/run/play.pid
.
Play server process ID is 7
This application is already running (Or delete /var/run/play.pid file).
Итак: Почему файл, содержащий RUNNING_PID, не удаляется, когда демон docker останавливается, получает перезапуск и перезапускает ранее запущенные контейнеры?Когда я$ docker inspect playappcontainer
, он говорит мне:
"State": {
"ExitCode": 255,
"FinishedAt": "2015-02-05T17:52:39.150013995Z",
"Paused": false,
"Pid": 0,
"Restarting": true,
"Running": true,
"StartedAt": "2015-02-05T17:52:38.479446993Z"
},
Хотя:
Основной процесс внутри контейнера получит SIGTERM, а после льготного периода - SIGKILL.
отСсылка Docker на $ docker stop
Чтобы убить работающий сервер Play, достаточно отправить процессу SIGTERM для правильного завершения работы приложения.