约1分钟后Docker容器被杀死

Arc*_*ten 3 elixir docker phoenix-framework

我制作了一个很小的Phoenix Framework应用程序(运行时得到的内容仅作了少许修改:mix phoenix.new)。我一直在尝试将其部署在Docker容器中。在容器运行时,它可以正常工作,但始终会在启动后一分钟内消失,并显示消息“已杀死”。我是否提出要求似乎并不重要。我尝试观看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)
Run Code Online (Sandbox Code Playgroud)

我对Docker和Elixir还是很陌生,所以我不确定我还可以做哪些其他研究。这里有一个类似的听起来的问题:我运行了一个docker容器,但几分钟后,它被自己杀死了

但是我不确定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
Run Code Online (Sandbox Code Playgroud)

建立:

docker build -t hello_phoenix .
Run Code Online (Sandbox Code Playgroud)

跑:

docker run -p 4000:4000 -m=512m hello_phoenix
Run Code Online (Sandbox Code Playgroud)

这样,它将运行约7秒钟,并以137错误代码退出。

编辑3:由于在我的容器中得到“ OOMKill”:true,所以我尝试朝另一个方向移动。我从运行命令中卸下了内存盖。我仍然得到相同的结果,但是现在“ OOMKill”设置为false,并且检查中的所有内存号现在都读取为0。此外,StopSignal现在设置为“ 15”

mic*_*ala 5

问题是yes |部分。当涉及到stdin和输入时,Erlang VM的行为与常规程序不同。它将缓冲您向其输入的所有输入,并随yes |其提供无限的yes。这些yes被缓冲并且内存增长,直到该进程被系统杀死为止,因为没有更多的内存了。

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