/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
参数。