如何使用supervisord在Docker容器中启动Docker守护程序?

时间:2015-03-14 08:18:08

标签: jenkins docker supervisord

我在Docker容器中使用了用户supervisord和Docker 1.5.0(使用debian jessie),但是我无法在Docker容器中运行任何容器:

$ docker run busybox bash
Unable to find image 'busybox:latest' locally
511136ea3c5a: Pull complete
df7546f9f060: Pull complete
ea13149945cb: Pull complete
4986bf8c1536: Pull complete
busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Status: Downloaded newer image for busybox:latest
FATA[0006] Error response from daemon: Cannot start container df7d5f605f5c1b6750614c6a04889e34aa9b96a4de98dcfc91b8f38f9d445aad: failed to find the cgroup root

这个可能bug(但人们似乎找到了解决办法),但我怀疑在启动docker守护进程之前我可能需要启动其他服务。建议的解决方法之一是安装cgroup-lite并在Docker守护程序之前启动它。但是我在Jessie找不到cgroup-lite包。出于这个原因,我也尝试将我的容器基于Ubuntu映像(14.04)而不是(cgroup-lite),但没有任何变化(我仍然得到相同的错误)。我开始怀疑这是因为upstart在启动容器时没有运行,我必须从cgroup-bin配置启动cgroup-litesupervisord。我当前的supervisord配置如下所示:

[supervisord]
user=root
nodaemon=true

[program:docker]
user=root
autostart=true
autorestart=true
command=/usr/bin/docker -d
redirect_stderr=true
stdout_logfile=/var/log/docker/%(program_name)s.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10

[program:jenkins]
user=jenkins
autostart=true
autorestart=true
command=/usr/local/bin/jenkins.sh
redirect_stderr=true
stdout_logfile=/var/log/jenkins/%(program_name)s.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
environment = JENKINS_HOME="/var/jenkins_home",HOME="/var/jenkins_home",USER="jenkins"

它是从Docker CMD开始的:

CMD sudo /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf

所以我的问题基本上是,如何使用supervisord启动Docker守护程序,并确保在program:docker启动之前加载所有依赖项(如果这实际上是问题)?

1 个答案:

答案 0 :(得分:2)

正如Javier Cortejoso指出的那样,一个名为DIND的项目包含一个名为wrapdocker的脚本,您可以使用该脚本在Docker中正确启动Docker。它负责启动和安装cgroup等。

解决方案是简单地下载wrapdocker脚本并将其包含在我的Dockerfile中:

# Install the magic wrapper.
ADD ./wrapdocker /usr/local/bin/wrapdocker
RUN chmod +x /usr/local/bin/wrapdocker

在我的主管配置中,我随后更改了command中的[program:docker]以指向wrapdocker脚本,而不仅仅是/usr/bin/docker -d

[supervisord]
user=root
nodaemon=true

[program:docker]
user=root
autostart=true
autorestart=true
command=/usr/local/bin/wrapdocker
redirect_stderr=true
stdout_logfile=/var/log/docker/%(program_name)s.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10

[program:jenkins]
user=jenkins
autostart=true
autorestart=true
command=/usr/local/bin/jenkins.sh
redirect_stderr=true
stdout_logfile=/var/log/jenkins/%(program_name)s.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
environment = JENKINS_HOME="/var/jenkins_home",HOME="/var/jenkins_home",USER="jenkins"