AWS EB,Play框架和Docker:应用程序已经运行

我在AWS Elastic Beanstalk上运行Play 2.2.3 Web应用程序,使用SBT生成Docker镜像。 从EBpipe理界面上传图像通常是可行的,但有时会进入一种状态,我一直得到以下错误:

Docker容器在Thu Nov 27 10:05:37 UTC 2014意外退出:Play服务器进程ID是1此应用程序已经运行(或删除/ opt / docker / RUNNING_PID文件)。

并且部署失败。 除了终止环境并重新设置以外,我无法做出任何其他的事情。 我怎样才能避免环境进入这种状态?

听起来像你可能会遇到臭名昭着的Pid 1问题。 Docker为每个容器使用一个新的pid名称空间,这意味着第一个进程获得PID 1. PID 1是一个特殊的ID,只能由devise使用它的进程使用。 你可以尝试使用Supervisord而不是将playframework作为主要进程运行,看看是否能解决你的问题? 希望supervisord比Play框架更好地处理Amazon的终止命令。

@dkm与我的dockerized play app有同样的问题。 我使用'$ sbt clean dist`命令将我的应用程序打包为独立产品。 这会生成一个.zip文件,您可以将其部署到泊坞窗容器中的某个文件夹,如/ var / www / xxxx。

获取bash shell到您的容器中: $ docker run -it <your image name> /bin/bash

例如: docker run -it centos/myapp /bin/bash

一旦应用程序在那里,你将不得不创build一个可执行的bash脚本,我叫我的startapp和内容应该是这样的:

在docker容器中创build脚本文件:

 $ touch startapp && chmod +x startapp $ vi startapp 

添加执行命令和任何必需的configuration:

 #!/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脚本,然后从一个新的terminal,然后你必须提交你的更改到你的容器的图像,所以它将从这里出来:

获取正在运行的容器的当前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应用程序

希望这可以帮助…