系统占用 docker 容器内的用户授权失败启动失败& postgres 建议挂载的目录是回环目录挂载失败
系统占用 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验证

systemd-coredump:input
systemd-coredump:input 是核心转储权限控制的核心组,与系统服务强相关,简单来说就是当程序崩溃了,用于生成崩溃的core 文件。
**postgres 容器内使用的用户uid **
-
使用
docker inspect postgres查看
为空表示在容器内使用 root 账号
-
临时启动容器查看
docker run -it --rm postgres id
表示使用root 账号
-
使用镜像构建查看
docker history --no-trunc postgres|grep -i "USER"
有的,这里表示增加 postgres 用户和组,使用uid:gid=999:999
-
通过 docker hub 查看
https://hub.docker.com/layers/library/postgres/latest/images/sha256-cdb16ede83438364ee7e4f30052a1b9c8c3e30df43ccfb6b6028a524adcd6001

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

基于这个,我们可以让 postgres 使用 2000 这个uid
chown -R 2000:2000 /data/postgres

然后在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
到了这里,我想着肯定成功了吧,现实狠狠地打了脸
还是报错

接着分析容器内是不是有这个目录呢?
首先使用docker inspect postgres查看镜像的元数据

发现镜像的元数据中的数据卷是 /var/lib/postgresql目录
但是网络上大多数都是建议挂载 /var/lib/postgresql/data目录

在 docker hub 的主页中,也有写到这个变化
https://hub.docker.com/_/postgres

简单一句话描述就是 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
启动

完美解决
网络上的信息会过时呀~~
更多推荐
所有评论(0)