/var/run/docker.sock无法在容器上运行centos 7

我正在启动一个容器,该容器运行一个bash脚本,在Centos 7.0.1406上使用docker 1.3.2在内部执行docker构build。 文件/命令在https://gist.github.com/wrabbit-revisited/1d70d0f1805be1848c08 。

docker构build需要访问docker套接字,所以我使用一个共同的技巧,根据http://nathanleclaire.com/blog/2014/07/12/10-docker-tips-and-tricks-that-will-make-你唱一首鲸鱼喜悦的歌 :

-v /var/run/docker.sock:/var/run/docker.sock 

在构build之前,我在脚本中运行一个检查:

 if [ -e "/var/run/docker.sock" ]; then echo "docker.sock found" else echo "docker.sock not found" fi 

和“回声”显示docker.sock未find。 如果检查是使用sudo在容器外部完成的,则会被发现。

我尝试在“docker run”命令行中添加“–permissive = true”,但没有明显的改变。

这里有一些类似的问题引用: https : //github.com/dpw/selinux-dockersock 。 它的目标是Fedora / RHEL,但是也不能解决这个问题。 如果我使用“setenforce Permissive”和sestatus来确保selinux处于宽容模式,问题仍然没有得到解决。

我也尝试添加“–security-opt = label:type:docker_t”到docker命令行,按照https://github.com/jwilder/nginx-proxy/issues/40 。 没有明显的影响。

Docker的selinux策略在这里描述: http : //www.unix.com/man-page/centos/8/docker_selinux/ 。

很多的信息,但我不知道,如果selinux是造成这个问题。 如果我编辑/ etc / selinux / config来禁用selinux,然后重新启动并运行sestatus它说selinux被禁用,但问题依然存在。

看来,这可能与此有关: https : //github.com/docker/compose/issues/983 。 使用这个技巧在容器中运行docker是相当普遍的,但也许有更好的方法来做到这一点或一个很好的解决方法。 我认为dind,但是这是工作,这是一个广泛使用,简单的(表面上),在容器内运行docker构build的方法。 可能有一个简单的解决scheme。

任何帮助,将不胜感激! 谢谢

我认为你的问题可能是由于对docker run-v选项的误解。 你说你做到了

 -v /var/run/docker:/var/run/docker 

这会在文件或目录/var/run/docker的容器中创build一个绑定装入。 但在你的情况下,没有这样的文件或目录。 你需要文件/var/run/docker.sock 。 所以你需要做的

 -v /var/run/docker.sock:/var/run/docker.sock 

将该文件绑定到容器中。

由于/var/run/docker不存在,您可能会想知道为什么docker没有告诉您有关错误的信息。 但-v选项具有令人惊讶的行为,如果主机上不存在该path,docker会将其创build为一个目录。 所以你最终会在主机和容器上产生一个无用的空的/var/run/docker目录。

原则上,你也可以使用-v /var/run:/var/run来绑定挂载的目录。 但是让一个容器访问主机的/var/run目录树可能是一个坏主意。

正如你在CentOS上一样,你还需要使用https://github.com/dpw/selinux-dockersock来访问/var/run/docker.sock以在强制模式下使用SELinux。

从长远来看,确认安装https://github.com/dpw/selinux-dockersock就足够了。

一个快速的替代方法是在启动容器时传递--privileged参数。