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

使用docker-compose部署Jenkins遇Docker套接字权限拒绝问题求助

解决Jenkins Docker Agent无法访问Docker Daemon的权限问题

从你给出的错误信息和docker-compose配置来看,核心问题是Jenkins容器内的jenkins用户没有访问/var/run/docker.sock的权限——主机上的这个socket文件属于docker用户组,而容器内的jenkins用户默认不在对应GID的组里,导致连接被拒绝。

你之前手动在运行的容器里添加组的操作会在容器重启后丢失,所以需要通过docker-compose配置永久解决这个问题,下面是几种可行方案:

方案1:临时测试用——以root用户运行Jenkins(不推荐生产环境)

这是最快验证问题的方式,直接让Jenkins容器以root用户启动,这样就拥有访问docker.sock的权限:

修改你的docker-compose.yml里的Jenkins服务配置,添加user: root:

jenkins:
    image: jenkinsci/blueocean:latest
    networks:
      - mynetwork
    user: root  # 添加这一行
    environment:
      - VIRTUAL_HOST=jenkins.mydomain.com
      - VIRTUAL_PORT=8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./jenkins-data:/var/jenkins_home
      - ./jenkins-docker-certs:/certs/client:ro
      - ./jenkins-home:/home
    restart: always

修改后重启服务:

docker-compose up -d --force-recreate jenkins

方案2:安全生产级配置——让Jenkins用户匹配主机Docker组GID

这种方式更安全,不需要用root用户运行,而是让容器内的jenkins用户加入和主机docker组GID一致的组:

步骤1:获取主机Docker组的GID

在VPS主机上执行以下命令,得到docker组的数字GID:

HOST_DOCKER_GID=$(getent group docker | cut -d: -f3)
echo $HOST_DOCKER_GID

比如输出可能是998或者1001,记下来这个数值。

步骤2:修改docker-compose配置

在Jenkins服务里添加用户配置,指定用户为jenkins:${HOST_DOCKER_GID},或者通过环境变量动态传入:

方式A:直接写死GID(如果你的主机docker组GID固定)

jenkins:
    image: jenkinsci/blueocean:latest
    networks:
      - mynetwork
    user: "jenkins:998"  # 替换成你刚才得到的HOST_DOCKER_GID数值
    environment:
      - VIRTUAL_HOST=jenkins.mydomain.com
      - VIRTUAL_PORT=8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./jenkins-data:/var/jenkins_home
      - ./jenkins-docker-certs:/certs/client:ro
      - ./jenkins-home:/home
    restart: always

方式B:动态传入GID(更灵活)

先在主机上导出环境变量:

export HOST_DOCKER_GID=$(getent group docker | cut -d: -f3)

然后修改docker-compose.yml,使用变量:

jenkins:
    image: jenkinsci/blueocean:latest
    networks:
      - mynetwork
    user: "jenkins:${HOST_DOCKER_GID}"
    environment:
      - VIRTUAL_HOST=jenkins.mydomain.com
      - VIRTUAL_PORT=8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./jenkins-data:/var/jenkins_home
      - ./jenkins-docker-certs:/certs/client:ro
      - ./jenkins-home:/home
    restart: always

启动时用以下命令加载变量:

docker-compose --env-file <(echo "HOST_DOCKER_GID=$HOST_DOCKER_GID") up -d --force-recreate jenkins

或者创建一个.env文件,写入HOST_DOCKER_GID=xxx,然后直接用docker-compose up -d启动。

步骤3:验证权限

重启Jenkins容器后,进入容器检查用户组:

docker exec -it <jenkins-container-name> id jenkins

输出里应该能看到你指定的GID(和主机docker组一致),此时再运行Docker Agent任务就不会有权限问题了。

为什么之前的操作无效?

你手动在运行的容器里把jenkins用户加入docker/root组,但Docker容器的文件系统是临时的——容器重启后所有修改都会丢失,所以必须通过docker-compose配置或者自定义镜像来永久生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:08:04