Docker挂载本地目录后容器内用户出现PermissionError 13如何解决?
问题根因
该问题由Linux系统UID/GID权限映射机制导致:Docker绑定挂载宿主机目录时会直接继承宿主机文件的UID、GID标识,容器内的用户名仅为UID的别名,系统最终以UID判断权限归属。你当前宿主机挂载目录的所有者为1002:1003,而镜像构建时默认创建的docker用户UID/GID和该值不匹配,因此出现权限不足报错。直接在容器内修改挂载目录文件属主会同步修改宿主机文件属性,因此不建议该操作。
解决方案
方案1:构建镜像时指定用户UID/GID(推荐,长期使用最优)
该方案可以让容器内docker用户的权限和宿主机完全对齐,无额外兼容问题。
- 修改Dockerfile中创建用户的逻辑,增加构建参数支持:
# 在原有adduser指令前新增以下两行参数定义 ARG UID=1000 ARG GID=1000 # 原有adduser指令修改为如下,传入指定的UID/GID RUN adduser --disabled-password --gecos '' --uid $UID --gid $GID docker && \ adduser docker sudo && \ echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
- 构建镜像时传入你宿主机对应用户的UID和GID(你当前环境为1002和1003):
docker build --build-arg UID=1002 --build-arg GID=1003 -t MyImage:1.0 .
构建完成后启动容器即可正常读写挂载目录。
方案2:启动容器时指定运行用户UID/GID(无需修改镜像,适合临时使用)
直接在启动命令中替换原有--user docker参数,指定为宿主机的UID:GID即可:
NV_GPU=1 nvidia-docker run -i \ --name $name \ --user 1002:1003 \ -v `pwd`:/home/docker/app \ -t MyImage:1.0 \ ${@:2}
注意:你当前镜像中已对
/.cache/pip、/.local等用户目录配置了全局读写权限,因此该方案不会出现其他路径的权限问题,如其他镜像使用该方案需确认相关目录权限配置。
方案3:宿主机目录开放全局写权限(仅临时测试使用)
如果仅为临时测试,不想修改镜像或启动参数,可在宿主机上给挂载目录开放全局可写权限:
chmod -R 777 `pwd`
该方案安全风险较高,仅适合本地私人开发环境临时使用,禁止在生产或公共环境使用。
内容的提问来源于stack exchange,提问作者GoingMyWay
相关产品推荐
相关产品推荐

