我正在使用 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.stat归postgres: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)
| 归档时间: |
|
| 查看次数: |
1888 次 |
| 最近记录: |