WSL2+Docker Desktop环境下配置Jenkins容器挂载Docker二进制文件被识别为目录的问题求助
各位好,我现在遇到一个WSL2+Docker Desktop环境下的Jenkins配置问题,想请大家帮忙看看:
之前在Linux机器上,我用这条命令就能成功部署Jenkins,让它能调用宿主机的Docker跑流水线:
sudo docker run -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):$(which docker) jenkins/jenkins:lts-jdk17
原理就是挂载宿主机的docker.sock和Docker可执行文件到容器里,当时还得给socket设666权限,不过那是临时PC环境,没什么问题。
现在我们的正式服务器是Windows系统,我装了Docker Desktop并启用了WSL2后端。但在Windows上照搬Linux的命令时发现,挂载WSL里的/usr/local/bin/docker到容器里时,这个文件会被识别成目录,Jenkins根本没法执行它。
我试过不少方法,跟大家说说过程:
- 一开始Linux命令直接失败后,我搜了旧帖子,试了给socket路径加双斜杠:
-v //var/run/docker.sock:/var/run/docker.sock - 还有人说把宿主机的
/usr/local/bin/docker挂到容器的/usr/bin/docker,但也没解决问题 - 现在我用的命令是:
docker run --name jenkins -p 8080:8080 -v //var/run/docker.sock:/var/run/docker.sock -v //usr/local/bin/docker:/usr/local/bin/docker jenkins/jenkins:lts-jdk17
进容器里查看的话,/usr/local/bin/docker显示是个目录:
drwxr-xr-x 2 root root 40 Aug 27 11:20 docker
为了排查问题,我做了个测试:在WSL里创建了一个普通文件/usr/local/bin/hello.txt,然后把它挂载到容器的/usr/local/bin/docker位置,结果进容器看,这个docker还是目录,而且里面的hello.txt也被识别成了目录!更奇怪的是,这些被识别成目录的项大小都是40,和空目录的大小一样。
还有几个诡异的现象:
docker.sock的挂载是正常的,进容器看是socket文件,能正常用- 我在WSL的文件系统里找不到
/var/run/docker.sock,但它确实能被挂载到容器里 - 如果挂载一个不存在的文件,Docker也会自动创建成目录
现在我最核心的问题是:怎么才能让Docker在WSL2+Docker Desktop环境下,把宿主机的Docker二进制文件(或者任意普通文件)正确挂载成文件,而不是目录? 另外,如果有关于在这个环境下实现Docker-outside-Docker(让容器调用宿主机Docker)的通用经验或者正确姿势,也欢迎大家分享!
内容来源于stack exchange

