Ubuntu Snap安装Docker后,Jenkins容器调用Docker异常求助
Jenkins容器内执行docker命令触发snap的解决方案
问题背景
主机Ubuntu通过snap install docker安装Docker,which docker显示路径为/snap/bin/docker,但该路径是软链接:
lrwxrwxrwx 1 root root 13 Mar 27 08:51 /snap/bin/docker -> /usr/bin/snap*
将该路径挂载到Jenkins容器的/usr/bin/docker后,进入容器执行docker命令实际调用的是snap命令,无法正常执行docker build等操作。
解决方案
方案1:挂载snap docker的实际二进制文件路径
snap安装的Docker实际执行文件不在软链接指向的snap,而是在snap/docker/[版本号]/bin/docker路径下:
- 先在主机查找实际路径:
realpath /snap/bin/docker # 示例输出:/snap/docker/2912/bin/docker(数字为当前snap docker的版本号) - 重新启动Jenkins容器,挂载这个实际路径:
注意:snap更新Docker后版本号会变化,需要重新确认路径。sudo docker run -d -p 80:8080 -p 50000:50000 \ -v /home/my/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /snap/docker/2912/bin/docker:/usr/bin/docker \ -v /etc/docker/daemon.json:/etc/docker/daemon.json \ jenkins/jenkins:lts
方案2:复制docker二进制文件到稳定路径
为了避免snap版本更新导致路径失效,可将docker二进制文件复制到主机的/usr/local/bin:
- 在主机执行复制并赋予执行权限:
sudo cp /snap/docker/current/bin/docker /usr/local/bin/docker sudo chmod +x /usr/local/bin/docker - 验证路径有效性:
which docker # 确保输出为/usr/local/bin/docker,若不是可调整PATH优先级 - 重新启动Jenkins容器挂载该路径:
此方法更稳定,不受snap更新影响。sudo docker run -d -p 80:8080 -p 50000:50000 \ -v /home/my/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/local/bin/docker:/usr/bin/docker \ -v /etc/docker/daemon.json:/etc/docker/daemon.json \ jenkins/jenkins:lts
方案3:使用Docker-in-Docker(DinD)环境
如果不想依赖主机Docker环境,可单独运行DinD容器供Jenkins调用:
- 启动DinD容器:
sudo docker run -d --name jenkins-dind \ --privileged \ -v /var/lib/docker \ docker:dind - 启动Jenkins容器连接到DinD:
这种方式提供独立的Docker环境,隔离性更强,但需要特权模式,资源占用略高。sudo docker run -d -p 80:8080 -p 50000:50000 \ --link jenkins-dind:docker \ -v /home/my/jenkins_home:/var/jenkins_home \ -e DOCKER_HOST=tcp://docker:2376 \ -e DOCKER_TLS_VERIFY=1 \ -e DOCKER_CERT_PATH=/certs/client \ -v jenkins-dind-certs:/certs/client:ro \ jenkins/jenkins:lts
内容的提问来源于stack exchange,提问作者Duojie
相关产品推荐
相关产品推荐

