docker compose exec app id
sudo chown -R 1000:1000 ./data
# compose 里固定运行用户
user: '1000:1000'

挂载 ./data:/app/data 之后应用起不来,日志报 Permission denied 打不开 /app/data/config.json,宿主机上这个文件权限是 644,换成 root 跑就好了,可生产不能用 root,改成同一个 uid 就好了。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:容器里跑的是非 root 用户,uid 和宿主机文件属主对不上,挂进来的目录按原 uid 解释,进程就没有写权限,不是文件本身权限设置的问题。

「compose 卷权限」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:先看容器内进程的 uid 和 gid 到底是多少 和目录属主对一下;在宿主机上把挂载目录 chown 成容器里的 uid 加 -R 递归一次;或者在 compose 里用 user 固定一个能对上的账号 别让它随镜像变。

确认没问题再收工,容器里能正常读写挂载目录,重启一次权限也没有回退,上传文件同样正常。

作者 9823189