在docker容器中自动运行服务

qkr*_*ger 35 riak docker

我正在设置一个简单的图像:一个保存Riak(一个NoSQL数据库).该图像riak start作为CMD 启动Riak服务.现在,如果我将它作为守护进程运行docker run -d quintenk/riak-dev,它确实启动了Riak进程(我可以在日志中看到它).但是,它会在几秒钟后自动关闭.如果我使用docker run -i -t quintenk/riak-dev /bin/bashriak进程运行它没有启动(更新:请参阅答案以获得解释).事实上,根本没有服务运行.我可以使用终端手动启动它,但我希望Riak自动启动.我认为其他服务也会出现这种情况,Riak只是一个例子.

因此,运行/重新启动容器应该会自动启动Riak.设置它的正确方法是什么?


作为参考,这里是用于创建图像的Dockerfile(更新:使用所选答案进行更改):

FROM ubuntu:12.04
RUN apt-get update
RUN apt-get install -y openssh-server curl 
RUN curl http://apt.basho.com/gpg/basho.apt.key | apt-key add -
RUN bash -c "echo deb http://apt.basho.com precise main > /etc/apt/sources.list.d/basho.list"
RUN apt-get update
RUN apt-get -y install riak
RUN perl -p -i -e 's/(?<=\{http,\s\[\s\{")127\.0\.0\.1/0.0.0.0/g' /etc/riak/app.config
EXPOSE 8098 
CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1
Run Code Online (Sandbox Code Playgroud)

编辑:-f根据他的评论,在CMD中改为-F


我自己的答案

在与Docker合作一段时间之后,我养成了使用supervisord来调整我的进程的习惯.如果您想要示例代码,请查看https://github.com/Krijger/docker-cookbooks.我使用我的主管图像作为我所有其他图像的基础.我在这里写了一篇关于使用主管的博客.

小智 43

要使docker容器保持运行,您需要在前台保持进程处于活动状态.

所以你可以用你的Dockerfile替换最后一行

CMD /bin/riak console
Run Code Online (Sandbox Code Playgroud)

甚至

CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1
Run Code Online (Sandbox Code Playgroud)

请注意,您不能拥有多行CMD语句,只能运行最后一行.


ses*_*esm 32

使用tail来保持容器存活是一种破解.另外,请注意,-f当日志轮换发生时,选项容器将终止(这可以通过使用-F来避免).

更好的解决方案是使用主管.看一下关于在Docker容器中运行Riak的本教程.

  • 看起来很有希望.如果您已经有与docker结合使用的经验,您是否愿意在这里分享一个简短的例子? (3认同)

qkr*_*ger 5

的解释为:

如果我使用docker run -i -t quintenk/riak-dev /bin/bashriak 进程运行它则不会启动

如下。在 Dockerfile 中使用 CMD 实际上与使用docker run {image} {command}. 正如 Gigablah 所说,仅使用最后一个 CMD,因此在这种情况下,Dockerfile 中写入的内容将被覆盖。

通过CMD /bin/riak start && tail -f /var/log/riak/erlang.log.1在 Buildfile 中使用,您可以使用 启动容器作为后台进程docker run -d {image},这就像一个魅力。


dam*_*ick 5

“如果我使用 docker run -i -t quintenk/riak-dev /bin/bash 运行它,则 riak 进程不会启动”

听起来您只想在附加到容器时能够监视日志。我的用例有点不同,因为我希望命令自动启动,但我希望能够附加到容器并位于 bash shell 中。我能够解决我们的两个问题,如下所示:

在镜像/容器中,将要自动启动的命令添加到/etc/bash.bashrc文件末尾。

在您的情况下,只需添加 line /bin/riak start && tail -F /var/log/riak/erlang.log.1,或根据所需的功能将/bin/riak starttail -F /var/log/riak/erlang.log.1放在单独的行上。

现在提交更改您的容器,并与再次运行它docker run -i -t quintenk/riak-dev /bin/bash。您会发现您放入 bashrc 中的命令在您附加时已经在运行。

  • 这实际上是一个非常好的解决方案 :) 请注意,0.6.5 添加了`docker run -a` 选项以实现主管兼容性。你可能也想解决这个问题。 (3认同)