在 docker 中运行的 Postgres 数据库一直挂起

Dav*_*ton 7 postgresql docker

我正在使用 postgres docker 映像,并且在使用在 docker 映像中运行的数据库数月后,现在我得到了在一段时间后,它们只是挂起的行为。我可以执行bin/bash但不能用 postgres 做任何事情;命令不会返回并且容器不能被关闭。甚至docker kill -s SIGKILL <container_id>不起作用;需要重新启动 docker 服务器才能停止它们。

我能看到的唯一吸烟枪是消息:

 WARNING:  could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
Run Code Online (Sandbox Code Playgroud)

在所有容器上。任何人都有任何想法,我会非常感激,因为这目前正在扼杀一切。

Nor*_*ing 11

这是由于 docker 容器中的用户权限不匹配而发生的。

列出容器中的相关文件:

$ docker exec <container> ls -l /var/lib/postgresql/data/pg_stat_tmp
-rw------- 1 root     root     [...] db_0.stat
-rw------- 1 root     root     [...] db_1.stat
-rw------- 1 root     root     [...] db_2.stat
-rw------- 1 postgres postgres [...] global.stat
Run Code Online (Sandbox Code Playgroud)

我们可以看到所有db_*.stat文件都归 拥有root:root,而global.statpostgres:postgres.

检查 docker 用户给我们:

$ docker exec <container> whoami
root
Run Code Online (Sandbox Code Playgroud)

因此,我们希望所有这些文件都归 postgres 用户所有。幸运的是,这很容易!只需将用户设置为postgres,然后重新启动!

在 dockerfile 中:

USER postgres
Run Code Online (Sandbox Code Playgroud)

使用 docker-compose:

services:
  postgres:
    image: postgres:13
    user: postgres
Run Code Online (Sandbox Code Playgroud)

  • 不为我工作。Postgres数据目录下的所有文件或目录都属于`postgres:postgres`,但是`docker log -f postgres`的日志仍然弹出``警告:无法打开统计文件“pg_stat_tmp/global.stat”:操作不正确允许`` (3认同)