Windows WSL2下Docker运行Python报Errno 13权限拒绝错误如何解决?
WSL2 环境Docker容器PermissionError解决方案
问题根因
该报错为WSL2环境Docker挂载的特有问题:镜像构建阶段设置的/code目录权限,会被WSL2的挂载逻辑覆盖。如果你的项目目录存放在Windows NTFS分区,通过Docker Desktop WSL集成挂载到容器内时,目录默认所有者为root,且会忽略镜像内置的权限配置,导致容器内运行的apache用户无写入权限。
解决方案
方案1:修正用户映射(最常用)
- 先查询容器内apache用户的UID和GID:
执行docker run --rm <你的镜像名称> id apache,记录输出的uid和gid值,默认apache的uid/gid为33:33 - 修改
docker-compose.yml对应服务配置,指定容器运行用户:services: web: # 替换为你实际的服务名 user: "33:33" # 替换为你查询到的apache用户uid:gid - 若项目仍存放在Windows分区,在WSL2终端编辑
/etc/wsl.conf添加如下配置:
保存后在Windows终端执行[automount] options = "metadata,umask=0022" mountFsTab = falsewsl --shutdown重启WSL2生效。
方案2:启动时强制修正权限
无需修改WSL2全局配置,直接在容器启动时添加权限赋值步骤,修改docker-compose.yml的command配置:
services: web: # 替换为你实际的服务名 command: /bin/sh -c "chown -R apache:apache /code && <你原来的启动命令,比如apache2-foreground>"
仅首次启动会执行全目录权限修改,后续启动无额外耗时
方案3:使用WSL2原生文件系统
将项目代码迁移到WSL2的EXT4路径下(例如/home/<你的WSL用户名>/project),直接在WSL2终端执行docker-compose up启动服务。WSL2原生路径的权限逻辑和Linux一致,不会覆盖镜像构建阶段设置的目录权限。
生效验证
修改配置后执行docker-compose down -v删除历史挂载卷,再重新启动服务即可验证权限问题是否解决。
内容的提问来源于stack exchange,提问作者andicolortoo
相关产品推荐
相关产品推荐

