You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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路径下:

  1. 先在主机查找实际路径:
    realpath /snap/bin/docker
    # 示例输出:/snap/docker/2912/bin/docker(数字为当前snap docker的版本号)
    
  2. 重新启动Jenkins容器,挂载这个实际路径:
    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
    
    注意:snap更新Docker后版本号会变化,需要重新确认路径。

方案2:复制docker二进制文件到稳定路径

为了避免snap版本更新导致路径失效,可将docker二进制文件复制到主机的/usr/local/bin:

  1. 在主机执行复制并赋予执行权限:
    sudo cp /snap/docker/current/bin/docker /usr/local/bin/docker
    sudo chmod +x /usr/local/bin/docker
    
  2. 验证路径有效性:
    which docker
    # 确保输出为/usr/local/bin/docker,若不是可调整PATH优先级
    
  3. 重新启动Jenkins容器挂载该路径:
    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
    
    此方法更稳定,不受snap更新影响。

方案3:使用Docker-in-Docker(DinD)环境

如果不想依赖主机Docker环境,可单独运行DinD容器供Jenkins调用:

  1. 启动DinD容器:
    sudo docker run -d --name jenkins-dind \
    --privileged \
    -v /var/lib/docker \
    docker:dind
    
  2. 启动Jenkins容器连接到DinD:
    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
    
    这种方式提供独立的Docker环境,隔离性更强,但需要特权模式,资源占用略高。

内容的提问来源于stack exchange,提问作者Duojie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:16:25