我在AWS Elastic Beanstalk上运行Play 2.2.3 Web应用程序,使用SBT生成Docker镜像的能力。从EB管理界面上传图像通常可以正常工作,但有时会进入我一直收到以下错误的状态:
Docker容器于2014年11月27日星期四10:05:37 UTC意外退出: 播放服务器进程ID为1此应用程序已在运行(或 删除/ opt / docker / RUNNING_PID文件)。
部署失败。除了终止环境并重新设置环境之外,我无法做到这一点。我怎样才能避免环境进入这种状态?
答案 0 :(得分:5)
听起来你可能会遇到臭名昭着的Pid 1问题。 Docker为每个容器使用一个新的pid命名空间,这意味着第一个进程获得PID 1. PID 1是一个特殊的ID,只能由设计使用它的进程使用。您是否可以尝试使用Supervisord而不是将playframework作为主要进程运行,看看是否能解决您的问题?希望supervisord比play框架更好地处理Amazon的终止命令。
答案 1 :(得分:1)
将bash shell放入容器中:$ docker run -it <your image name> /bin/bash
示例:docker run -it centos/myapp /bin/bash
一旦应用程序在那里,您将不得不创建一个可执行的bash脚本,我称之为我的startapp
,内容应该是这样的:
在docker容器中创建脚本文件:
$ touch startapp && chmod +x startapp
$ vi startapp
添加执行命令&amp;任何所需的配置:
#!/bin/bash
/var/www/<your app name>/bin/<your app name> -Dhttp.port=80 -Dconfig.file=/var/www/pointflow/conf/<your app conf. file>
然后从新终端保存startapp脚本,然后您必须将更改提交到容器的图像,以便从现在开始提供:
获取正在运行的容器的当前ID:
$ docker ps
提交/保存更改
$ docker commit <your running containerID> <your image's name>
示例:docker commit 1bce234 centos/myappsname
现在,对于最后的结局,您可以停靠或退出正在运行的容器的bash。接下来使用以下docker命令启动播放应用程序:
$ docker run -d -p 80:80 <your image's name> /bin/sh startapp
示例:docker run -d -p 80:80 centos/myapp /bin/sh startapp
运行docker ps
以查看您的应用是否正在运行。你会看到类似的东西:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19eae9bc8371 centos/myapp:latest "/bin/sh startapp" 13 seconds ago Up 11 seconds 0.0.0.0:80->80/tcp suspicious_heisenberg
打开浏览器并访问新的dockerized app
希望这会有所帮助......