如何使用supervisord在Docker容器内启动Docker守护进程?

我是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 

可能是一个错误 (但人们似乎已经find了解决方法),但我怀疑我可能需要启动我的docker守护进程之前启动其他服务。 build议的解决方法之一是安装cgroup-lite并在Docker守护程序之前启动它。 但是我无法在Jessie中findcgroup-lite软件包。 基于这个原因,我也尝试将我的容器放在Ubuntu映像(14.04)上(而不是cgroup-lite ),但没有任何变化(我仍然得到相同的错误)。 我开始怀疑这是因为启动容器时启动不运行,我必须从我的supervisordconfiguration启动cgroup-bincgroup-lite 。 我目前的supervisordconfiguration如下所示:

 [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启动(如果这实际上是问题)?

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

解决scheme是简单地下载wrapdocker脚本,并将其包含在我的Dockerfile

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

然后在我的主pipeconfiguration中,我改变了[program:docker] wrapdocker [program:docker]command来指向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"