WSL2环境下Jenkins容器内执行Docker命令提示Permission denied问题求助
解决方案
问题根因
你遇到的docker: Permission denied报错核心来自两个WSL2环境特有的权限问题:
- 直接挂载Windows路径下的docker配置、以及WSL2宿主机的docker二进制到容器内,drvfs(WSL跨Windows文件系统挂载)的默认权限限制导致容器内用户没有二进制执行权限
- 配置中
group_add指定的GID 1000和WSL2宿主机docker组的实际GID不匹配,导致容器内用户无法读写/var/run/docker.sock
推荐修复方案(两种可选,优先选第二种)
方案1:基于sock挂载的修复
- 第一步:在WSL2 Debian终端执行命令获取docker组GID:
getent group docker | awk -F: '{print $3}'
记录返回的数值,示例返回值为998。 - 第二步:修改docker-compose.yml配置:
version: '2.4' services: jenkins: # 后续替换为自定义镜像名 image: jenkins/jenkins user: root privileged: true container_name: jenkins restart: unless-stopped ports: - 8080:8080 - 8443:8443 - 50000:50000 group_add: # 替换为上一步查询到的实际docker组GID - 998 volumes: - jenkins_home:/var/jenkins_home # 替换为WSL2 Debian内的.docker配置路径,不要使用/c/Users开头的Windows路径 - /root/.docker/config.json:/root/.docker/config.json:ro - /root/.docker/machine/certs:/root/.docker:ro - /var/run/docker.sock:/var/run/docker.sock environment: - JENKINS_OPTS="--prefix=/jenkins" volumes: jenkins_home:
- 第三步:构建带docker客户端的自定义Jenkins镜像
在docker-compose.yml同目录创建Dockerfile,内容如下:
FROM jenkins/jenkins:lts USER root RUN apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release && \ mkdir -m 0755 -p /etc/apt/keyrings && \ curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ apt-get update && apt-get install -y docker-ce-cli && \ rm -rf /var/lib/apt/lists/* # 若保持root用户启动可删除下行 USER jenkins
执行docker-compose build构建镜像后再启动容器即可。
方案2:基于TCP端口暴露的修复(WSL2+Docker Desktop下更省心,无权限问题)
- 第一步:打开Docker Desktop设置,在General选项卡勾选「Expose daemon on tcp://localhost:2375 without TLS」,点击Apply & Restart生效。
- 第二步:修改docker-compose.yml配置如下,无需挂载sock、docker二进制、docker配置:
version: '2.4' services: jenkins: image: jenkins/jenkins user: root privileged: true container_name: jenkins restart: unless-stopped ports: - 8080:8080 - 8443:8443 - 50000:50000 volumes: - jenkins_home:/var/jenkins_home environment: - JENKINS_OPTS="--prefix=/jenkins" # 新增环境变量指向宿主机Docker Daemon - DOCKER_HOST=tcp://host.docker.internal:2375 volumes: jenkins_home:
- 第三步:同方案1的第三步,给Jenkins镜像内置docker客户端,或者进入容器后手动安装docker-cli即可正常执行docker命令。
临时验证方法
如果要快速验证逻辑是否生效,可以在WSL2宿主机执行sudo chmod 666 /var/run/docker.sock临时放开sock权限,进入容器测试docker命令是否正常执行,确认没问题后再换回权限控制的方案。
内容的提问来源于stack exchange,提问作者Loandoer
相关产品推荐
相关产品推荐

