我做了一个非常小的凤凰框架应用程序(只是稍微修改了你运行时得到的: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"
答案 0 :(得分:4)
问题在于yes |
部分。
当涉及到标准输入和输入时,Erlang VM的行为与常规程序不同。它将缓冲你向它投掷的任何输入,并且yes |
你给它一个无限的流。这些因素被缓冲,内存增长,直到系统杀死进程,因为没有更多的内存。
对于使用Elixir / Erlang的任何东西使用yes |
通常是一个坏主意,对于长时间运行的任务更是如此 - 对于短期运行的任务,你有机会在内存不足之前完成它们,但是它仍然不是一个好主意。
答案 1 :(得分:0)
不确定这是否仍然相关,但整个无限流问题似乎只是通过管道echo y
来解决。
例如:
echo y | mix compile
虽然我不确定是否有一些我缺少的东西,这使得它成为一个愚蠢的解决方案。
编辑:这可能更好 https://stackoverflow.com/a/25921514