小编典典

在Docker容器中自动运行服务

docker

我正在设置一个简单的图像:包含Riak(一个NoSQL数据库)的图像。该映像以riak startCMD形式启动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

编辑:根据sesm的说明,-f在CMD中更改为-F


我自己的答案

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


阅读 702

收藏
2020-06-17

共1个答案

小编典典

要使Docker容器保持运行状态,您需要在前台保持活动状态。

因此,您可以将Dockerfile中的最后一行替换为

CMD /bin/riak console

甚至

CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1

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

2020-06-17