Portainer部署的PostgreSQL容器版本不兼容无法访问如何解决
解决方案
你之前执行的brew postgresql-upgrade-database是macOS下brew包管理器管理的本地PostgreSQL的升级命令,和容器内Debian环境的PostgreSQL完全无关,因此不会生效。
方案1:快速恢复服务(无需升级数据,优先推荐先执行)
- 登录Portainer,找到故障的PostgreSQL容器,停止运行
- 编辑容器配置,将镜像版本从
latest或14调整为postgres:13(任意13大版本的镜像均可) - 保存配置后重新启动容器,此时镜像版本与数据目录初始化的版本匹配,服务即可正常启动
启动后第一时间执行全量备份,命令如下:
# 替换<>占位符为你的实际配置 docker exec -it <你的pg容器名> pg_dumpall -U <你的pg管理员用户名> > pg_full_backup.sql
你也可以直接在Portainer的容器控制台中执行pg_dumpall -U <用户名>,将输出内容保存为备份文件。
方案2:升级数据兼容PostgreSQL 14版本
如果需要使用14版本的PostgreSQL,按以下步骤操作:
- 先执行方案1启动13版本容器,完成全量备份,并验证备份文件有效性
- 停止13版本容器,提前备份完整的PostgreSQL数据卷,避免操作失误导致数据丢失
- 清空原有PostgreSQL数据目录,或为数据卷重命名后挂载到其他路径作为备份留存
- 编辑容器配置,将镜像改回
postgres:14,启动容器,此时会自动初始化一个14版本的空数据目录 - 执行备份导入命令:
cat pg_full_backup.sql | docker exec -i <你的pg容器名> psql -U <你的pg管理员用户名> -d postgres
- 导入完成后验证业务数据完整性,即可正常使用14版本的PostgreSQL服务
相关说明
- 是否需要进入容器内操作?如果采用
pg_upgrade原地升级的方案需要进入容器执行命令,但更推荐上述备份后导入的方案,兼容性更高,出现异常的概率远低于原地升级 - 后续避免同类问题的方法:不要使用
latest标签的PostgreSQL镜像,建议固定大版本号(如postgres:13、postgres:14),避免容器重新拉取镜像时自动跨大版本升级引发兼容问题
内容的提问来源于stack exchange,提问作者Mr. Hankey
相关产品推荐
相关产品推荐

