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

Docker挂载本地目录写入报Permission denied权限错误如何解决

Docker挂载目录写入权限报错问题解答

报错原因

Docker 挂载宿主机目录时,权限校验基于用户ID(UID)和用户组ID(GID),而非用户名,你的报错核心来自两个问题:

  1. 你在Dockerfile中对/usr/tmp执行的chown操作会被后续的挂载指令覆盖,相当于完全没有生效,容器实际访问的是宿主机/home/userxyz/projects/data目录的原有权限
  2. 容器内创建的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:42:03