编辑:有一个相关的问题正在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文档中建议的方式更改文件位置为 /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 stop 的 Docker 参考文档
为了停止运行中的 Play 服务器,只需向进程发送一个 SIGTERM 信号即可正常关闭应用程序。
/opt/docker/RUNNING_PID
没有创建RUNNING_PID文件,因此它可以正常工作。然而,不同之处在于像这样在.conf
中设置它将使其适用于所有运行/部署模式(即使需要PID文件的模式),而在build.sbt
中通过in Universal
限定则仅适用于sbt-native-packager部署。 - dhpiggottapplication.conf
中似乎也可以设置play.server.pidfile.path=/dev/null
。 - James Ward