系统占用 docker 容器内的用户授权失败启动失败& postgres 建议挂载的目录是回环目录挂载失败

问题

使用docker 启动 postgres 容器,挂载指定目录

docker run -d \
--name pg \
-v /data/postgres:/var/lib/postgresql/data \
-p 5432:5432 \
-e POSTGRES_USER=root \
-e POSTGRES_PASSWORD=aA123456 \
postgres

直接启动提示错误

8f7edd72a4fbfb837ed60f92e55176f8cd9b2511274686479feaa03af1151188
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/data/postgres" to rootfs at "/var/lib/postgresql/data": change mount propagation through procfd: open o_path procfd: open /data/docker/lib/overlay2/51a975357544cbbe15d37636a0cdc0a0ceb9798886f7fc6a3acbbdf7ace0f13f/merged/var/lib/postgresql/data: no such file or directory: unknown.

怀疑是挂载的目录,权限问题

chmod -R 700 /data/postgres
chown -R 999:999 /data/postgres

执行上述命令,启动还是失败

# root @ test in /data [11:17:13] C:127
$ chmod -R 700 postgres      
(base) 
# root @ test in /data [11:18:26] 
$ chown -R 999:999 postgres
(base) 
# root @ test in /data [11:18:30] 
$ ls -l
总用量 36
drwx--x--x 3 root             root    4096 3月   7 2025 docker
drwxrwxrwx 2 root             root   16384 2月   5 2025 lost+found
drwxr-xr-x 5 root             root    4096 5月   9 17:11 mysql
drwxr-xr-x 4             1001 docker  4096 8月  11 23:29 n8n_zh
drwxrwxrwx 4 root             root    4096 2月   5 2025 ollama_models
drwx------ 2 systemd-coredump input   4096 10月 16 19:57 postgres
(base) 

原因排查

使用 ls -l查看,发现显式的用户不是 999 而是 systemd-coredump:input

说明宿主机里面的uid=999 已经被占用了

使用 getent passwd 999验证

image-20251017113106934

systemd-coredump:input

systemd-coredump:input 是核心转储权限控制的核心组,与系统服务强相关,简单来说就是当程序崩溃了,用于生成崩溃的core 文件。

**postgres 容器内使用的用户uid **

  1. 使用 docker inspect postgres 查看

    image-20251017142356605

    为空表示在容器内使用 root 账号

  2. 临时启动容器查看docker run -it --rm postgres id

    image-20251017142456859

    表示使用root 账号

  3. 使用镜像构建查看docker history --no-trunc postgres|grep -i "USER"

    image-20251017142640110

    有的,这里表示增加 postgres 用户和组,使用uid:gid=999:999

  4. 通过 docker hub 查看

    https://hub.docker.com/layers/library/postgres/latest/images/sha256-cdb16ede83438364ee7e4f30052a1b9c8c3e30df43ccfb6b6028a524adcd6001

    Clipboard_Screenshot_1760682775

解决方案

指定uid:gid

使用 cat /etc/passwd | cut -d: -f1,3,4 查看当前系统中占用的 uid:gid

image-20251017144436421

基于这个,我们可以让 postgres 使用 2000 这个uid

chown -R 2000:2000 /data/postgres

image-20251017144542159

然后在docker 启动的时候,指定 2000 用户

docker run -d \
--name pg \
-v /data/postgres:/var/lib/postgresql/data \
-p 5432:5432 \
-e POSTGRES_USER=root \
-e POSTGRES_PASSWORD=aA123456 \
postgres

到了这里,我想着肯定成功了吧,现实狠狠地打了脸

还是报错

image-20251017152708446

接着分析容器内是不是有这个目录呢?

首先使用docker inspect postgres查看镜像的元数据

image-20251017152846594

发现镜像的元数据中的数据卷是 /var/lib/postgresql目录

但是网络上大多数都是建议挂载 /var/lib/postgresql/data目录

Clipboard_Screenshot_1760686199

在 docker hub 的主页中,也有写到这个变化

https://hub.docker.com/_/postgres

Clipboard_Screenshot_1760686401

简单一句话描述就是 postgres 17 及以下,挂载 /var/lib/postgresql/data目录

Postgres 17 以上的版本,挂载 /var/lib/postgresql目录

好吧,再次看到了希望

使用

docker run -d \
--name pg \
-v /data/postgres:/var/lib/postgresql \
-p 5432:5432 \
-e POSTGRES_USER=root \
-e POSTGRES_PASSWORD=aA123456 \
postgres

启动

image-20251017153707011

完美解决

网络上的信息会过时呀~~

更多推荐