Docker 使用 root 启动 compose 向映射 volume 写文件失败

使用 root 启动 compose 引发没有写入权限问题

今天使用 root 用户启动了一个 docker compose 工程.

1
2
3
4
5
6
version: "2"
services:
service:
volumes:
- ./data:/data
...

启动的时候报错

1
2
3
4
5
Recreating ops_service_1 ... done
Attaching to ops_service_1
service_1 | touch: cannot touch '/data/xxx.log': Permission denied
service_1 | Can not write to /data/xxx.log. Wrong volume permissions?
ops_service_1 exited with code 1

查看当前目录下的 data 文件夹权限 ls -l:

1
2
-rw-r--r--  1 root root  189 12月 24 11:17 docker-compose.yml
drwxr-xr-x 13 root root 4096 12月 24 11:27 data

什么? 创建的文件夹权限是 root:root 是什么情况? 此时主机 data 文件夹为主机 root:root 权限, 在容器内, 即使使用容器内的 root:root 也只能当成主机的普通用户使用. 主机的普通用户对文件夹的权限为 r-x 没有写入权限.

解决方案

首先在 docker-compose.yml 中指定执行用户及用户组 1000:1000

1
2
3
4
5
6
7
version: "2"
services:
service:
user: 1000:1000
volumes:
- ./data:/data
...

手动给 data 文件夹授权

1
sudo chown 1000:1000 ./data

此时, 文件夹用户和用户组为 1000:1000, 在容器内部, 使用的用户及用户组也为 1000:1000, 二者权限相同, 问题解决.

参考文档: Running a Docker container as a non-root user

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.