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

Docker Rootless模式下卷权限异常:无法写入卷的问题咨询

问题分析与解决

核心原因

  1. Rootless Docker的UID/GID映射规则
    Rootless模式下,Docker会把主机非root用户的UID(比如你的1000)映射成容器内的root(UID 0);而容器内的非root UID(比如你创建的1000)会对应主机的一个偏移UID(默认从100000开始)。这就导致:
  • 主机./src的1000:1000权限,挂载到容器后显示为root:root(因为主机1000对应容器0)。
  • 你在容器内执行chown 1000:1000,实际是把文件权限改成容器内的1000,对应主机的UID是100000+1000=101000——这个UID在主机上不存在,所以主机读不了这些文件。
  1. 配置冲突
    你在Dockerfile里创建了UID 1000的用户,又在docker-compose里指定user:1000:1000,但Rootless模式下容器内的1000和主机的1000不属于同一个UID空间,自然权限不匹配。

解决方案

方案1:用容器内root运行(对应主机用户)

这是最简单的方法:

  • 删掉docker-compose里的user: '1000:1000'配置。
  • 修改Dockerfile,注释掉最后一行USER $USER,让容器默认以root运行(容器内root就是主机的1000用户)。

修改后的Dockerfile:

FROM php:8.1.12-fpm-alpine

ARG USER=me
ARG UID=1000
ARG GID=$UID

RUN adduser \
    --disabled-password \
    --gecos "" \
    --no-create-home \
    --uid "$UID" \
    "$USER"

RUN mkdir -p /data \
    && chown $UID:$UID /data

# 注释掉USER指令,默认以root运行
# USER $USER

这样容器内操作/data的权限,主机端看到的就是1000:1000,不需要额外改权限。

方案2:调整主机UID映射,让容器内1000对应主机1000

  1. 编辑/etc/subuid和/etc/subgid,添加一行(把yourusername换成你的主机用户名):
    yourusername:1000:1
    
    这会让容器内的UID 1000直接映射到主机的UID 1000。
  2. 重启Docker服务:
    systemctl --user restart docker
    
  3. 保持原Dockerfile和docker-compose配置不变,此时容器内/data的权限会和主机一致,容器内改权限后主机也能正常读取。

方案3:创建容器用户时用主机映射的UID

先查看Rootless Docker的UID映射规则:

docker info | grep "UID Mapping"

默认输出类似0:1000:1(主机1000对应容器0),你可以把Dockerfile里的UID设为0:

FROM php:8.1.12-fpm-alpine

ARG USER=me
ARG UID=0
ARG GID=$UID

RUN adduser \
    --disabled-password \
    --gecos "" \
    --no-create-home \
    --uid "$UID" \
    "$USER"

RUN mkdir -p /data \
    && chown $UID:$UID /data

USER $USER

这样容器内的用户就是root(对应主机1000),挂载卷的权限会自动匹配。

内容的提问来源于stack exchange,提问作者Francois M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:40:27