执行Docker Prune后PostgreSQL容器崩溃:找不到pg-qualstats文件
解决PostgreSQL Docker容器因pg-qualstats丢失崩溃的问题
错误原因
执行docker system prune后,手动安装在容器内部的pg-qualstats扩展文件被清理(未持久化到数据卷),但PostgreSQL配置文件postgresql.conf中仍保留了加载该扩展的配置,导致容器启动时找不到文件崩溃。
解决步骤
1. 临时启动容器,绕过扩展依赖
容器启动失败是因为shared_preload_libraries配置中包含pg-qualstats,先修改配置跳过加载:
- 如果使用数据卷存储PostgreSQL数据,挂载数据卷到临时容器修改配置:
找到docker run --rm -v [你的PG数据卷名称]:/var/lib/postgresql/data -it alpine vi /var/lib/postgresql/data/postgresql.confshared_preload_libraries行,移除其中的pg-qualstats,保存退出。 - 或者启动临时容器时覆盖配置参数:
docker run --name temp-pg -e POSTGRES_PASSWORD=[你的密码] -d postgres:16.2 -c shared_preload_libraries=''
修改完成后,尝试启动原容器,此时应该能正常启动。
2. 重新安装pg-qualstats并持久化
为避免再次出现丢失问题,需将扩展文件持久化,推荐两种方式:
方式一:构建自定义PostgreSQL镜像(推荐)
创建Dockerfile:
FROM postgres:16.2 RUN apt-get update && apt-get install -y build-essential postgresql-server-dev-16 git \ && git clone https://github.com/powa-team/pg_qualstats.git \ && cd pg_qualstats && make && make install \ && apt-get remove -y build-essential postgresql-server-dev-16 git \ && apt-get autoremove -y && rm -rf /var/lib/apt/lists/* /pg_qualstats
构建镜像:
docker build -t postgres-16-pgqualstats .
之后使用该镜像启动容器,扩展会内置在镜像中,不会因容器清理丢失。
方式二:挂载宿主机目录存储扩展文件
- 先找到PostgreSQL的扩展目录:
进入正常运行的PostgreSQL容器,执行:pg_config --pkglibdir # 输出类似 /usr/lib/postgresql/16/lib pg_config --sharedir # 输出类似 /usr/share/postgresql/16 - 在宿主机创建对应目录:
mkdir -p ~/pg-extensions/lib ~/pg-extensions/share - 启动容器时挂载这两个目录:
docker run -d \ -v [你的PG数据卷名称]:/var/lib/postgresql/data \ -v ~/pg-extensions/lib:/usr/lib/postgresql/16/lib \ -v ~/pg-extensions/share:/usr/share/postgresql/16 \ --name postgres-16 \ -e POSTGRES_PASSWORD=[你的密码] \ postgres:16.2 - 进入容器安装扩展:
docker exec -it postgres-16 bash apt-get update && apt-get install -y build-essential postgresql-server-dev-16 git git clone https://github.com/powa-team/pg_qualstats.git cd pg_qualstats && make && make install
3. 恢复扩展加载配置
容器正常运行后,修改postgresql.conf,将pg-qualstats重新加入shared_preload_libraries:
shared_preload_libraries = 'pg_qualstats' # 若有其他扩展,用逗号分隔,如'pg_stat_statements,pg_qualstats'
重载配置或重启容器:
# 重载配置(无需重启容器) docker exec -it postgres-16 psql -U postgres -c "SELECT pg_reload_conf();" # 或重启容器 docker restart postgres-16
最后在需要的数据库中创建扩展(若之前已创建可跳过):
docker exec -it postgres-16 psql -U postgres -d [你的数据库名] -c "CREATE EXTENSION pg_qualstats;"
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

