【发布时间】:2019-12-24 17:59:07
【问题描述】:
如果你有树莓派,这个问题很简单,很容易重现。我正在尝试从基本备份恢复在 docker 容器内运行的 postgresql 12 数据库,但阻止这种情况发生的问题仅仅是使用 PG 12 和 armv71 我无法重新启动删除数据目录的容器,如下所述。
我在两个不同的环境中通过 DockerHub 使用官方的postgresql docker container,一个是我的本地开发环境,它是一台运行 Ubuntu 18 LTS 的 PC,另一个是 Raspberry Pi armv71。
我需要的操作是删除正在运行的容器上/var/lib/postgresql/data的内容,然后重新启动容器,根据文档,这将强制运行docker-entrypoint.sh脚本,让我的恢复脚本火(它在我的 Ubuntu 机器上执行)。
所以在我的电脑上这个过程可以正常工作:
docker run --name website_db_1
这只是启动默认/vanilla postgresql docker 容器(我故意遗漏了密码)
然后,一旦启动并运行,强制容器运行 docker-entrypoint.sh 脚本,我这样做:
docker exec -it website_db_1 bash -c "rm /var/lib/postgresql/data/* -r"
docker container restart website_db_1
容器应该重新初始化,并且正如我所指出的,如果我要将适当的恢复脚本添加到 docker-entrpoint.sh 文件或 init 文件夹中,我确实可以让 wal 存档恢复正常工作(在我的Ubuntu PC)。
在 armv71 架构上,但在我的 Raspberry Pi 上,此完全相同的代码会导致容器日志中出现以下错误:
initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
db_1 | If you want to create a new database system, either remove or empty
db_1 | the directory "/var/lib/postgresql/data" or run initdb
db_1 | with an argument other than "/var/lib/postgresql/data".
是说目录不为空,但应该是我刚刚用上一行删除了,代码在Ubuntu上运行正常。同样在 Pi 上,我已经从容器内观察,以确认目录在重新启动之前确实是空的。怎么回事?
另一个有趣的事实是,上面的这个过程在使用postgres 11 的两种架构上都可以正常工作,我只是在更新到postgres 12 后遇到了困难。
知道为什么 PG 12 会导致 armv71 出现此问题吗?如果您有 pi,这很容易重现。
如果它很重要,以下是我正在使用的 postgresql 版本:
PostgreSQL 12.1 (Debian 12.1-1.pgdg100+1) on arm-unknown-linux-gnueabihf, compiled by gcc (Debian 8.3.0-6)
PostgreSQL 12.1 (Debian 12.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
【问题讨论】:
标签: postgresql docker