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

时间:2015-03-16 23:55:38

标签: sockets docker selinux centos7

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

docker build需要访问docker socket,所以我按照http://nathanleclaire.com/blog/2014/07/12/10-docker-tips-and-tricks-that-will-make-you-sing-a-whale-song-of-joy/使用一个常用技巧:

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

在构建之前,我在脚本中运行检查:

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

并且“echo”显示找不到docker.sock。如果使用sudo在容器外部进行检查,则会发现。

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

这里有一些类似的问题:https://github.com/dpw/selinux-dockersock。它针对Fedora / RHEL,但也没有解决这个问题。如果我使用“setenforce Permissive”和sestatus来确保selinux处于许可模式,问题仍未得到解决。

我还尝试按照https://github.com/jwilder/nginx-proxy/issues/40将“--security-opt = label:type:docker_t”添加到docker命令行。没有明显效果。

这里描述了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构建的方法。可能有一个简单的解决方案。

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

2 个答案:

答案 0 :(得分:6)

我认为您的问题可能是由于对-v的{​​{1}}选项的误解。你说你做了

docker run

这将在容器中为文件或目录-v /var/run/docker:/var/run/docker 创建绑定装载。但在你的情况下,没有这样的文件或目录。您想要文件/var/run/docker。所以你需要做

/var/run/docker.sock

将该文件挂载到容器中。

由于-v /var/run/docker.sock:/var/run/docker.sock 并不存在,您可能想知道为什么docker没有告诉您错误。但是/var/run/docker选项具有令人惊讶的行为,即如果主机上不存在该路径,则docker会将其创建为目录。所以你最终在主机和容器上找到了一个无用的空-v目录。

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

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

答案 1 :(得分:2)

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

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