Docker容器在约1分钟后死亡

Docker容器在约1分钟后死亡,docker,elixir,phoenix-framework,Docker,Elixir,Phoenix Framework,我制作了一个非常小的Phoenix框架应用程序(仅对运行时得到的:mix Phoenix.new进行了轻微修改)。我一直在尝试将其部署到Docker容器中。它在容器运行时工作正常,但它总是在启动后一分钟内消失,并显示一条消息“Killed”。我是否向它发出请求似乎并不重要。我试着看了docker事件,得到了以下结果: $ docker events 2016-04-09T16:24:02.538602484-04:00 container create ef45a768723c64125c71

我制作了一个非常小的Phoenix框架应用程序(仅对运行时得到的: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还很陌生,所以我不确定我还能做些什么。这里有一个类似的问题:

但我不确定OP是如何或是否解决了这个问题。提前感谢您的任何提示。请让我知道,如果有任何其他信息,我可以得到,可能会有所帮助

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

编辑2:我对容器的内存限制进行了更多的研究,发现容器的生存时间与我允许的内存量直接相关。所以我创建了一个全新的项目(mix——没有早午餐——没有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 .
运行:

这样,它运行了大约7秒,并以137错误代码退出


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

问题在于
yes
部分。 当涉及到stdin和输入时,erlangvm的行为与常规程序不同。它将缓冲您向它抛出的任何输入,并使用
yes
为它提供无限的yes流。这些“是”会被缓冲,内存会不断增长,直到进程被系统终止,因为已经没有内存了


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

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

例:

echo y|混合编译

虽然我不确定我是否遗漏了一些东西,使这成为一个愚蠢的解决方案

编辑:这可能更好

您的虚拟机中是否运行其他容器?如果容器内存不足,它仍然有可能被内核杀死。
docker-inspect
是否显示它是否“oom-killed”?我没有其他容器。做
docker inspect hello\u phoenix
似乎没有说它被“oom killed”了。如果有用的话,我可以尝试在中编辑该信息。docker日志hello\u phoenix是否显示了有用的东西,可以给你一个它退出的线索?我对phoenix没有任何经验,但是,
mix phoenix.server
是在前台启动一个进程,还是将其后台化?(我现在在机场,wi-fi糟糕,无法运行Docker日志Docker日志只告诉我:[info]在端口4000上使用http与Cowboy一起运行Hellophenix.Endpoint会杀死
mix phoenix.server
确实会在前台启动一个进程,但我相信我可以在分离模式下启动它。现在考虑一下
--force
可能是一种方法。例如
混合编译--force
docker run -p 4000:4000 -m=512m hello_phoenix