我最近不得不删除系统上的所有Docker容器,当VSCode用PostgreSQL重建我的Java devcontainer时,它无法启动。我在日志中得到以下错误:
PostgreSQL Database directory appears to contain a database; Skipping initialization
2023-11-07 20:27:40.074 UTC [1] FATAL: database files are incompatible with server
2023-11-07 20:27:40.074 UTC [1] DETAIL: The data directory was initialized by PostgreSQL version 15, which is not compatible with this version 16.0 (Debian 16.0-1.pgdg120+1).
字符串
我假设这是因为新映像使用了旧映像的数据库。这个数据库到底存储在哪里,如果它在docker system prune --all --force --volumes
之后仍然存在,我该如何删除它?
1条答案
按热度按时间h7appiyu1#
似乎您有一个卷,其中包含与v. 15兼容的PostgreSQL示例,但您试图用
postgres:16
映像加载它。这是不可能的,因为数据目录与较新版本的Postgres不立即兼容。即使没有Docker,从较旧的数据库示例/集群移动到较新的数据库二进制文件需要1)dump/reload或2)使用pg_upgrade
。下面是一些选项:选项0:查找并删除数据集群
您提到您有3个
.yml
文件-您需要在对应于postgres:##
的服务的volumes:
部分下查找。如果不知道实际的目录Map,我不能100%帮助您。但是,由于我们知道您执行了docker system prune --all --force --volumes
,并且数据仍然存在,那么我们就知道你试图覆盖的数据不在Docker卷中,而可能是Map到你的主机的某个目录。一旦你确定了是哪个目录,您可以1)从.yml
文件中删除Map,或者2)删除Map文件夹的内容选项1:坚持使用Postgres 15
快速解决此问题,只需在
docker-compose.yml
文件中从使用postgres:16
图像更改为使用postgres:15
图像选项2:使用Postgres 15转储,然后重新加载到Postgres 16
使用
postgres:15
映像对数据库集群调用pg_dump
将导致数据库的逻辑/明文转储。使用此转储,您可以使用新的Docker卷启动postgres:16
映像,然后使用psql
将转储的内容复制到新数据库中选项3:使用pg_upgrade对集群进行升级
注意:这要复杂得多,需要一些关于容器如何工作的高级知识。
要使用
pg_upgrade
,您需要使用postgres:15
镜像(最好在Debian/Ubuntu底层操作系统上运行)。您需要使用apt
安装Postgres 16,然后使用pg_upgrade
升级数据目录。之后,您可以拆除容器,并使用postgres:16
容器访问和提供现已更新的数据集群。