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

时间:2014-11-27 10:17:59

标签: amazon-web-services playframework docker elastic-beanstalk

我在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文件)。

部署失败。除了终止环境并重新设置环境之外,我无法做到这一点。我怎样才能避免环境进入这种状态?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

将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

希望这会有所帮助......