Docker容器在〜1分钟后死亡

我做了一个非常小的凤凰框架应用程序(只是稍微修改了你运行时得到的:mix phoenix.new)。 我一直在试图部署在Docker容器中。 它在容器运行的时候工作正常,但是在启动的一分钟内总是死掉,并且显示“Killed”消息。 我是否提出要求似乎并不重要。 我试着看docker事件,得到以下结果:

$ 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,我还是很新的,所以我不确定我能做些什么其他的研究。 这里有一个类似的问题: 我运行一个docker集装箱,但几分钟后,它被自己杀死了

但是我不确定OP是如何解决的。 预先感谢任何提示。 请让我知道,如果有任何其他信息,我可以得到这可能有帮助。

编辑1:我了解到docker ps -a实际上会告诉我在其他地方没有find的退出代码。 我的所有容器都以137错误代码退出。 我的docker虚拟机具有4GB的内存,所以我试着运行一个-m = 3g标志,但得到了相同的结果。 我也没有看到在Windows进程pipe理器方法3GB的任何进程。

编辑2:我玩了更多的内存限制在我的容器上,发现容器所在的时间与我允许的内存数量直接相关。 所以我创build了一个全新的项目(mix –no-brunch –no-ecto phoenix.new),复制了我的Dockerfile,并试图构build并运行它。 它给了我完全相同的结果。 这导致我相信我的问题是在我的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 

build立:

 docker build -t hello_phoenix . 

跑:

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

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

编辑3:因为我在我的容器中获得“OOMKill”:我尝试向另一个方向移动。 我从运行命令中删除了内存上限。 我仍然得到相同的结果,但是现在“OOMKill”被设置为false,并且从我的检查中的所有存储器号码现在读为0.此外,现在将StopSignal设置为“15”

问题是yes | 部分。 当涉及到标准input和input时,Erlang VM与常规程序的行为不同。 它会缓冲你input的任何input,并且yes | 你给它一个无限的stream。 这些内存被caching,内存增长,直到进程被系统杀死,因为没有剩余的内存。

使用yes |通常是一个糟糕的主意 任何使用Elixir / Erlang的东西,对于长时间运行的任务来说更是如此 – 在短暂运行的任务中,在内存耗尽之前你有机会完成它们,但这仍然不是一个好主意。

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

例如:

echo y | mix compile

虽然我不确定是否有什么我错过,这使得这个愚蠢的解决scheme。

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