作者:mobiledu2502938445 | 来源:互联网 | 2023-05-17 18:11
我正在启动一个运行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-你唱一首鲸鱼之歌/:
-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处于许可模式,问题仍未得到解决.
我还尝试将"--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构建的方法.可能有一个简单的解决方案.
任何帮助,将不胜感激!谢谢
1> 小智..:
我认为你的问题可能是由于误解了-v
选项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
将该文件挂载到容器中.
如果/var/run/docker
不存在,您可能想知道为什么docker没有告诉您有关错误的信息.但该-v
选项具有令人惊讶的行为,如果主机上不存在该路径,则docker会将其创建为目录.所以你最终/var/run/docker
在主机和容器上有一个无用的空目录.
原则上,您还-v /var/run:/var/run
可以绑定mount包含的目录.但是,让容器访问主机的/var/run
目录树可能是个坏主意.
当您使用CentOS时,您还需要使用https://github.com/dpw/selinux-dockersock访问/var/run/docker.sock,以便在执行模式下使用SELinux.
谢谢@David selinux-dockersock是必不可少的!