Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is pg_restore segfaulting in Docker?

I am testing a backup/restore procedure for my postgres DB inside a docker container.

I dump my db like this:

$ docker exec -ti my_postgres_container pg_dump -Fc -U postgres > db.dump

Afterwards, I try to restore it like this:

$ docker cp db.dump my_postgres_container:/db.dump
$ docker exec -ti my_postgres_container pg_restore -U postgres -c -d postgres db.dump

The command returns without output or errors, but nothing happens.

So instead, I tried to restore it manually like this:

$ docker cp db.dump my_postgres_container:/db.dump
$ docker exec -ti my_postgres_container bash
root@fdaad610bee3:/# pg_restore -U postgres -c -d postgres db.dump
Segmentation fault (core dumped)

Why is pg_restore segfaulting when trying to read my DB dump?

like image 887
blubb Avatar asked Sep 17 '20 09:09

blubb


1 Answers

Analysis:

The problem is caused by a corruption when dumping the DB. pg_dump produces binary output. This output is first passed through the Docker container's stdout and then redirected into a file on the host. Somewhere on the way, non-ASCII bytes are corrupted.

Solution:

Let pg_dump write to a file inside the Docker container, then copy that out to the host:

correct dumping procedure:

docker exec -ti my_postgres_container bash -c 'pg_dump -Fc -U postgres > /db.dump'
docker cp my_postgres_container:/db.dump db.dump

correct restoring procedure:

docker cp db.dump my_postgres_container:/db.dump
docker exec -ti my_postgres_container pg_restore -U postgres -c -d postgres db.dump
like image 143
blubb Avatar answered Sep 26 '22 16:09

blubb