Docker容器在约1分钟后被杀死

时间:2016-04-09 20:52:59

标签: docker elixir phoenix-framework

我做了一个非常小的凤凰框架应用程序(只是稍微修改了你运行时得到的:mix phoenix.new)。我一直在尝试将其部署在Docker容器中。它在容器运行时工作正常,但它始终在启动后的一分钟内死亡,并显示" Killed消息。"我是否向它发出请求似乎并不重要。我试着观看码头活动,并得到以下信息:

$ docker events
2016-04-09T16:24:02.538602484-04:00 container create 
ef45a768723c64125c717a7b40ee7513e477f27339c6266bd28cc3084c60e11f
(image=gcr.io/myprojectname/myapp:v2, name=amazing_bhabha)

2016-04-09T16:24:02.550438045-04:00 container attach
ef45a768723c64125c717a7b40ee7513e477f27339c6266bd28cc3084c60e11f   
(image=gcr.io/myprojectname/myapp:v2, name=amazing_bhabha)

2016-04-09T16:24:02.599731705-04:00 network connect 
c64a1439c8095f82ab0fea5c48b563c8aac7256d6064b3189b0bc8d052d69fe4
(name=bridge, type=bridge, container=ef45a768723c64125c717a7b40ee7513e477f27339c6266bd28cc3084c60e11f)

2016-04-09T16:24:02.600048755-04:00 container start
ef45a768723c64125c717a7b40ee7513e477f27339c6266bd28cc3084c60e11f 
(image=gcr.io/myprojectname/myapp:v2, name=amazing_bhabha)

2016-04-09T16:24:53.858352733-04:00 container die 
ef45a768723c64125c717a7b40ee7513e477f27339c6266bd28cc3084c60e11f 
(name=amazing_bhabha, image=gcr.io/myprojectname/myapp:v2)

2016-04-09T16:24:53.930349810-04:00 network disconnect
c64a1439c8095f82ab0fea5c48b563c8aac7256d6064b3189b0bc8d052d69fe4 
(container=ef45a768723c64125c717a7b40ee7513e477f27339c6266bd28cc3084c60e11f, name=bridge, type=bridge)

我对Docker和Elixir来说还是一个新手,所以我不确定我能做些什么其他的研究。这里有一个类似的问题:I run a docker container,but after few minutes , it was killed by himself

但我不确定OP是如何解决它的。提前感谢任何提示。如果我能获得其他可能有帮助的信息,请告诉我。

编辑1:我了解到docker ps -a实际上会告诉我退出代码,这是我在其他地方找不到的。我的所有容器都以137错误代码退出。我的docker VM有4GB内存,所以我尝试使用-m = 3g标志运行,但结果相同。我也没有看到Windows进程资源管理器中的任何进程接近3GB。

编辑2:我对容器的内存限制更多地玩了一下,发现容器所在的时间与我允许的内存量直接相关。所以我创建了一个全新的项目(mix --no-brunch --no-ecto phoenix.new),复制了我的Dockerfile,并尝试构建并运行它。它给了我完全相同的结果。这让我相信我的问题出在我的Dockerfile中,或者我是如何运行应用程序的。

Dockerfile:

FROM marcelocg/phoenix
MAINTAINER Arcaten
RUN echo $PWD
#Copy source
ADD . ./
#Get dependencies
RUN yes | mix local.hex
RUN yes | mix deps.get
#compile
RUN yes | mix compile
RUN ls -l
EXPOSE 4000
#Run server
ENTRYPOINT yes | MIX_ENV=dev mix phoenix.server

构建

docker build -t hello_phoenix .

执行命令

docker run -p 4000:4000 -m=512m hello_phoenix

然后,它运行大约7秒钟,并以137错误代码退出。

编辑3:自从我收到了#OOMKill":在我的容器中为真,我尝试向另一个方向移动。我从运行命令中删除了内存上限。我仍然得到相同的结果,但现在" OOMKill"设置为false,我检查的所有内存编号现在都读为0.此外,StopSignal现在设置为" 15"

2 个答案:

答案 0 :(得分:4)

问题在于yes |部分。 当涉及到标准输入和输入时,Erlang VM的行为与常规程序不同。它将缓冲你向它投掷的任何输入,并且yes |你给它一个无限的流。这些因素被缓冲,内存增长,直到系统杀死进程,因为没有更多的内存。

对于使用Elixir / Erlang的任何东西使用yes |通常是一个坏主意,对于长时间运行的任务更是如此 - 对于短期运行的任务,你有机会在内存不足之前完成它们,但是它仍然不是一个好主意。

答案 1 :(得分:0)

不确定这是否仍然相关,但整个无限流问题似乎只是通过管道echo y来解决。

例如:

echo y | mix compile

虽然我不确定是否有一些我缺少的东西,这使得它成为一个愚蠢的解决方案。

编辑:这可能更好 https://stackoverflow.com/a/25921514