编辑: 在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"。
$ docker run --restart=always -d --name playappcontainer "./opt/bin/playapp"
当我$ service docker stop && service docker restart 然后$ docker attach playappcontainer控制台告诉我:
$ 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。
-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 inspect playappcontainer,它告诉我:
$ 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发送到进程即可正确关闭应用程序。
从Play框架文档中停止Play应用程序
我根据答案和有关此问题的进一步工作,梳理出了一种解决方法。如果我按以下方式启动容器,则在(意外)停止/重新启动后它们将启动。冲突的RUNNING_PID文件不会阻止容器重新启动。
$ sudo docker run --restart=on-failure:5 -d \ --name container my_/container:latest \ sh -c "rm -f /var/run/play.pid && ./opt/bin/start \ -Dpidfile.path=/var/run/play.pid"
它的作用是删除包含进程ID的文件,该文件在运行二进制文件之前每次都使用选项放置在特定位置。