blubb
blubb

Reputation: 9910

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?

Upvotes: 14

Views: 4938

Answers (3)

Joshua Chia
Joshua Chia

Reputation: 1978

TLDR: -t should not be used unnecessarily.

I think for your pg_dump, the -t is corrupting the data written to db.dump. For that matter, the -i is also redundant since pg_dump does not need to read from stdin.

For your pg_restore, you need neither option. If you redirect stdin from outside the container, then you need -i.

I had the same problem and solved it by using neither -i nor -t for the pg_dump.

I think the following fixed pg_dump should work for your case:

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

Incidentally for the pg_restore, you don't need to copy the dump file to the container. You can just redirect stdin from the dump file on the host:

$ docker exec -i my_postgres_container pg_restore -Fc -c -U postgres -d postgres < db.dump

Upvotes: 10

Senhorzim
Senhorzim

Reputation: 141

For those like me that have the corrupt dump and can't follow the accepted answer, I found a workaround here

The dump file's format is DOS when you open with vim,
and if you change this to unix (:set ff=unix) and save it,
the segmentation fault will go away

And that does works.

Upvotes: 5

blubb
blubb

Reputation: 9910

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

Upvotes: 31

Related Questions