Public Repository

Last pushed: 3 hours ago
Short Description
a PoC for using "pg_upgrade" inside Docker
Full Description

pg_upgrade, Docker style

(Source for this image is available at https://github.com/tianon/docker-postgres-upgrade.)

Tags of this image are of the format OLD-to-NEW, where OLD represents the version of PostgreSQL you are currently running, and NEW represents the version of PostgreSQL you would like to upgrade to.

In order to get good performance, it is recommended to run this image with docker run image --link (see pg_upgrade documentation for more details).

For this to be feasible, your directory structure should look something like this: (if yours does not, either adjust it, or scroll down to see the alternate pattern for running this image)

$ find DIR -mindepth 2 -maxdepth 2
DIR/OLD/data
DIR/NEW/data

$ docker run --rm \
    -v DIR:/var/lib/postgresql \
    tianon/postgres-upgrade:OLD-to-NEW \
    --link

...

More concretely, assuming OLD of 9.4, NEW of 9.5, and DIR of /mnt/bigdrive/postgresql:

$ find /mnt/bigdrive/postgresql -mindepth 2 -maxdepth 2
/mnt/bigdrive/postgresql/9.4/data
/mnt/bigdrive/postgresql/9.5/data

$ docker run --rm \
    -v /mnt/bigdrive/postgresql:/var/lib/postgresql \
    tianon/postgres-upgrade:9.4-to-9.5 \
    --link

...

(which assumes that your previous postgres:9.4 instance was running with -v /mnt/bigdrive/postgresql/9.4/data:/var/lib/postgresql/data, and your new postgres:9.5 instance will run with -v /mnt/bigdrive/postgresql/9.5/data:/var/lib/postgresql/data)


If your two directories (denoted below as PGDATAOLD and PGDATANEW) do not follow this structure, then the following may also be used (but will be slower):

$ docker run --rm \
    -v PGDATAOLD:/var/lib/postgresql/OLD/data \
    -v PGDATANEW:/var/lib/postgresql/NEW/data \
    tianon/postgres-upgrade:OLD-to-NEW

...

More concretely, assuming OLD of 9.4, NEW of 9.5, PGDATAOLD of /mnt/bigdrive/postgresql-9.4, and PGDATANEW of /mnt/bigdrive/postgresql-9.5:

$ docker run --rm \
    -v /mnt/bigdrive/postgresql-9.4:/var/lib/postgresql/9.4/data \
    -v /mnt/bigdrive/postgresql-9.5:/var/lib/postgresql/9.5/data \
    tianon/postgres-upgrade:9.4-to-9.5

...

(which assumes that your previous postgres:9.4 instance was running with -v /mnt/bigdrive/postgresql-9.4:/var/lib/postgresql/data, and your new postgres:9.5 instance will run with -v /mnt/bigdrive/postgresql-9.5:/var/lib/postgresql/data)


Putting it all together:

$ mkdir -p postgres-upgrade-testing
$ cd postgres-upgrade-testing
$ OLD='9.4'
$ NEW='9.5'

$ docker pull "postgres:$OLD"
$ docker run -dit \
    --name postgres-upgrade-testing \
    -v "$PWD/$OLD/data":/var/lib/postgresql/data \
    "postgres:$OLD"
$ sleep 5
$ docker logs --tail 100 postgres-upgrade-testing

$ # let's get some testing data in there
$ docker exec -it \
    -u postgres \
    postgres-upgrade-testing \
    pgbench -i -s 10

$ docker stop postgres-upgrade-testing
$ docker rm postgres-upgrade-testing

$ docker run --rm \
    -v "$PWD":/var/lib/postgresql \
    "tianon/postgres-upgrade:$OLD-to-$NEW" \
    --link

$ docker pull "postgres:$NEW"
$ docker run -dit \
    --name postgres-upgrade-testing \
    -v "$PWD/$NEW/data":/var/lib/postgresql/data \
    "postgres:$NEW"
$ sleep 5
$ docker logs --tail 100 postgres-upgrade-testing

$ # can now safely remove "$OLD"
$ sudo rm -rf "$OLD"
Docker Pull Command
Owner
tianon

Comments (1)
tabdoelhafiezkhan
4 months ago

Hello tianon,

Thank you for the image. We hope you can help us with this question: We are trying to upgrade from pg9.4 to pg 9.6, but the docker hub default images do not have the postgres version in there path $PGDATA. So it's /var/lib/postgresql/data and not /var/lib/postgresql/9.4/data.

We are getting these errors when trying the upgrade:

  • Without --link:
    [tiabd@dockerbuild tmp]$ docker run --rm \

    -v /tmp/pg9.4:/var/lib/postgresql/data \
    -v /tmp/pg9.6:/var/lib/postgresql/data \
    tianon/postgres-upgrade:9.4-to-9.6
    docker: Error response from daemon: Duplicate mount point '/var/lib/postgresql/data'.
    See 'docker run --help'.
    [tiabd@dockerbuild tmp]$

  • With --link:

[tiabd@dockerbuild tmp]$ docker run --rm -v /tmp:/var/lib/postgresql/ "tianon/postgres-upgrade:9.4-to-9.6" --link

check for "/var/lib/postgresql/9.4/data/base" failed: No such file or directory

Failure, exiting

Hope you can help us further.

Kind regards,
Tim