我有一个生产数据库的转储,我可以使用以下命令在 Docker 容器中轻松恢复它:
docker exec -it my_db_container pg_restore --user=my_user --dbname=dbname sql/current.dump
。一切正常,数据都在这里。
但是,当我使用
docker exec -it my_db_container -U my-user -F c -b dbname > docker/db/current_stripped.dump
从 docker 重新转储本地数据库回到项目文件夹时,我的转储文件已创建(具有适当的大小和内容),但我无法使用它再次恢复 (docker exec -it whasq-db pg_restore --user=my-user --dbname=dbname sql/current_stripped.dump
)由于错误而导致的新数据库:pg_restore: [custom archiver] could not read from input file: end of file
但是恢复命令与生产环境中使用的相同(除了my_user
,它是生产中的postgres)。
我也遇到了同样的问题,并按如下方式解决了。我切换到
-f
或 --file
选项而不是管道(取自 https://stackoverflow.com/a/51073680/6593069)。我在容器内创建了转储文件,然后将其复制到我的主机。
在你的情况下这意味着:
docker exec -it my_db_container -U my-user -F c -b dbname -f current_stripped.dump
docker cp my_db_container:current_stripped.dump .
旧线程,但我在 Docker 上运行的 Postgres 16 也遇到了这个问题。
问题是使用 docker exec -t 或 -ti 运行 pg_dump。伪 TTY 会在生成的备份文件中附加一些 EOL,因此 pg_restore 稍后不会接受它。
只需运行不带 -ti 的命令即可:
docker exec my_db_container pg_dump -Fc --user=my_user --dbname=dbname > sql/current.dump
docker exec my_db_container pg_restore -Fc --user=my_user --dbname=dbname sql/current.dump
您可以在这个 github 问题上找到有关此主题的讨论:https://github.com/docker-library/postgres/issues/219