【发布时间】:2015-04-05 17:56:13
【问题描述】:
编辑:有一个相关问题是discussed on Github,但在另一种部署模式下(Typesafe Activator UI 而不是 Docker)。
我试图模拟系统重启以验证 Docker 重启策略,该策略声明能够以正确的顺序重新运行容器。
我有一个用 Java 编写的 Play 框架应用程序。
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 文档的建议将 change the location of the file 改为 /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).
那么:为什么当 docker 守护进程停止、重新启动并重新启动之前运行的容器时,包含 RUNNING_PID 的文件没有被删除?
当我$ 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 reference on $ docker stop
要杀死正在运行的 Play 服务器,发送一个 SIGTERM 到 正确关闭应用程序的过程。
来自Play Framework documentation on stopping a Play application
【问题讨论】:
标签: java playframework playframework-2.0 docker playframework-2.3