Docker挂载本地目录写入报Permission denied权限错误如何解决
Docker挂载目录写入权限报错问题解答
报错原因
Docker 挂载宿主机目录时,权限校验基于用户ID(UID)和用户组ID(GID),而非用户名,你的报错核心来自两个问题:
- 你在Dockerfile中对
/usr/tmp执行的chown操作会被后续的挂载指令覆盖,相当于完全没有生效,容器实际访问的是宿主机/home/userxyz/projects/data目录的原有权限 - 容器内创建的
userxyz用户的UID/GID和宿主机上userxyz的UID/GID不一致,你看到的user#500100就是容器内用户的UID在宿主机无对应用户的显示结果。读操作可正常执行是因为宿主机目录默认开放了其他用户的读权限,写操作无对应权限就会报错。
解决方案
方案1:运行时指定UID/GID(推荐,无需修改镜像)
首先在宿主机执行以下命令获取userxyz的UID和GID:
# 查UID id -u userxyz # 查GID id -g userxyz
假设查询结果为UID=1000、GID=1000,修改docker run命令,新增--user参数传入UID:GID即可:
docker run --rm --user 1000:1000 -v /home/userxyz/projects/data:/usr/tmp userxyz/test gdal_translate -ot UInt32 /usr/tmp/input.tif /usr/tmp/output.tif
该方案无需修改现有镜像,适合多用户共用同一镜像的场景。
方案2:构建镜像时固定UID/GID
如果你需要将用户信息固化到镜像中,可以修改Dockerfile,新增构建参数传入宿主机的UID/GID:
FROM osgeo/gdal:alpine-small-latest # 新增构建参数,默认值可根据实际情况调整 ARG UID=1000 ARG GID=1000 RUN mkdir /usr/tmp RUN addgroup -S -g $GID userxyz \ && adduser -S -D -u $UID -h /usr/tmp userxyz userxyz \ && chown -R userxyz:userxyz /usr/tmp USER userxyz WORKDIR /usr/tmp
构建镜像时传入当前宿主机userxyz的UID/GID:
docker build --build-arg UID=$(id -u userxyz) --build-arg GID=$(id -g userxyz) -t userxyz/test .
构建完成后直接执行原有docker run命令即可正常写入,生成的文件归属也会和宿主机userxyz一致。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

