Skip to content

Commit 46c44fc

Browse files
committed
Update documentation and examples for PGDATA changes
This is a lot more explicit about upgrades instead of relying on implicit image defaults (which change in 18+, so were hard to write generic documentation around anyways).
1 parent 508188d commit 46c44fc

File tree

1 file changed

+43
-27
lines changed

1 file changed

+43
-27
lines changed

README.md

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,73 @@ This is a PoC for using `pg_upgrade` inside Docker -- learn from it, adapt it fo
66

77
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.
88

9-
In order to get good performance, it is recommended to run this image with `docker run image --link` (see [`pg_upgrade` documentation](https://www.postgresql.org/docs/9.5/static/pgupgrade.html) for more details).
9+
In order to get good performance, it is recommended to run this image with `docker run image --link` (see [`pg_upgrade` documentation](https://www.postgresql.org/docs/18/pgupgrade.html) for more details).
1010

1111
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)
1212

1313
```console
1414
$ find DIR -mindepth 2 -maxdepth 2
15-
DIR/OLD/data
16-
DIR/NEW/data
15+
DIR/OLD/docker
16+
DIR/NEW/docker
1717

1818
$ docker run --rm \
19-
-v DIR:/var/lib/postgresql \
19+
--mount 'type=bind,src=DIR,dst=/var/lib/postgresql' \
20+
--env 'PGDATAOLD=/var/lib/postgresql/OLD/docker' \
21+
--env 'PGDATANEW=/var/lib/postgresql/NEW/docker' \
2022
tianon/postgres-upgrade:OLD-to-NEW \
2123
--link
2224

2325
...
2426
```
2527

26-
More concretely, assuming `OLD` of `9.4`, `NEW` of `9.5`, and `DIR` of `/mnt/bigdrive/postgresql`:
28+
More concretely, assuming `OLD` of `17`, `NEW` of `18`, and `DIR` of `/mnt/bigdrive/postgresql`:
2729

2830
```console
2931
$ find /mnt/bigdrive/postgresql -mindepth 2 -maxdepth 2
30-
/mnt/bigdrive/postgresql/9.4/data
31-
/mnt/bigdrive/postgresql/9.5/data
32+
/mnt/bigdrive/postgresql/17/docker
33+
/mnt/bigdrive/postgresql/18/docker
3234

3335
$ docker run --rm \
34-
-v /mnt/bigdrive/postgresql:/var/lib/postgresql \
35-
tianon/postgres-upgrade:9.4-to-9.5 \
36+
--mount 'type=bind,src=/mnt/bigdrive/postgresql,dst=/var/lib/postgresql' \
37+
--env 'PGDATAOLD=/var/lib/postgresql/17/docker' \
38+
--env 'PGDATANEW=/var/lib/postgresql/18/docker' \
39+
tianon/postgres-upgrade:17-to-18 \
3640
--link
3741

3842
...
3943
```
4044

41-
(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`)
45+
(as in, your previous `postgres:17` instance was running with `-v /mnt/bigdrive/postgresql/17/docker:/var/lib/postgresql/data`, and your new `postgres:18` instance will run with `-v /mnt/bigdrive/postgresql/18/docker:/var/lib/postgresql`, which is explicitly accounting for [docker-library/postgres#1259](https://github.com/docker-library/postgres/pull/1259))
4246

4347
---
4448

4549
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):
4650

4751
```console
4852
$ docker run --rm \
49-
-v PGDATAOLD:/var/lib/postgresql/OLD/data \
50-
-v PGDATANEW:/var/lib/postgresql/NEW/data \
53+
--mount 'type=bind,src=PGDATAOLD,dst=/var/lib/postgresql/OLD/docker' \
54+
--mount 'type=bind,src=PGDATANEW,dst=/var/lib/postgresql/NEW/docker' \
55+
--env 'PGDATAOLD=/var/lib/postgresql/OLD/docker' \
56+
--env 'PGDATANEW=/var/lib/postgresql/NEW/docker' \
5157
tianon/postgres-upgrade:OLD-to-NEW
5258

5359
...
5460
```
5561

56-
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`:
62+
More concretely, assuming `OLD` of `17`, `NEW` of `18`, `PGDATAOLD` of `/mnt/bigdrive/postgresql-17`, and `PGDATANEW` of `/mnt/bigdrive/postgresql-18`:
5763

5864
```console
5965
$ docker run --rm \
60-
-v /mnt/bigdrive/postgresql-9.4:/var/lib/postgresql/9.4/data \
61-
-v /mnt/bigdrive/postgresql-9.5:/var/lib/postgresql/9.5/data \
62-
tianon/postgres-upgrade:9.4-to-9.5
66+
--mount 'type=bind,src=/mnt/bigdrive/postgresql-17,dst=/var/lib/postgresql/17/docker' \
67+
--mount 'type=bind,src=/mnt/bigdrive/postgresql-18,dst=/var/lib/postgresql/18/docker' \
68+
--env 'PGDATAOLD=/var/lib/postgresql/17/docker' \
69+
--env 'PGDATANEW=/var/lib/postgresql/18/docker' \
70+
tianon/postgres-upgrade:17-to-18
6371

6472
...
6573
```
6674

67-
(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`)
75+
(which assumes that your previous `postgres:17` instance was running with `-v /mnt/bigdrive/postgresql-17:/var/lib/postgresql/data`, and your new `postgres:18` instance will run with `-v /mnt/bigdrive/postgresql-18:/var/lib/postgresql/18/docker`, although that's [not recommended](https://github.com/docker-library/postgres/pull/1259#issuecomment-3433788598))
6876

6977
---
7078

@@ -73,14 +81,16 @@ Putting it all together:
7381
```console
7482
$ mkdir -p postgres-upgrade-testing
7583
$ cd postgres-upgrade-testing
76-
$ OLD='9.4'
77-
$ NEW='9.5'
84+
$ OLD='17'
85+
$ NEW='18'
7886

79-
$ docker pull "postgres:$OLD"
8087
$ docker run -dit \
8188
--name postgres-upgrade-testing \
82-
-e POSTGRES_PASSWORD=password \
83-
-v "$PWD/$OLD/data":/var/lib/postgresql/data \
89+
--env POSTGRES_PASSWORD='password' \
90+
--env POSTGRES_INITDB_ARGS='--data-checksums' \
91+
--mount "type=bind,src=$PWD,dst=/var/lib/postgresql" \
92+
--env PGDATA="/var/lib/postgresql/$OLD/docker" \
93+
--pull always \
8494
"postgres:$OLD"
8595
$ sleep 5
8696
$ docker logs --tail 100 postgres-upgrade-testing
@@ -95,19 +105,25 @@ $ docker stop postgres-upgrade-testing
95105
$ docker rm postgres-upgrade-testing
96106

97107
$ docker run --rm \
98-
-v "$PWD":/var/lib/postgresql \
108+
--env POSTGRES_INITDB_ARGS='--data-checksums' \
109+
--mount "type=bind,src=$PWD,dst=/var/lib/postgresql" \
110+
--env "PGDATAOLD=/var/lib/postgresql/$OLD/docker" \
111+
--env "PGDATANEW=/var/lib/postgresql/$NEW/docker" \
112+
--pull always \
99113
"tianon/postgres-upgrade:$OLD-to-$NEW" \
100114
--link
101115

102-
$ docker pull "postgres:$NEW"
103116
$ docker run -dit \
104117
--name postgres-upgrade-testing \
105-
-e POSTGRES_PASSWORD=password \
106-
-v "$PWD/$NEW/data":/var/lib/postgresql/data \
118+
--env POSTGRES_PASSWORD='password' \
119+
--env POSTGRES_INITDB_ARGS='--data-checksums' \
120+
--mount "type=bind,src=$PWD,dst=/var/lib/postgresql" \
121+
--env PGDATA="/var/lib/postgresql/$NEW/docker" \
122+
--pull always \
107123
"postgres:$NEW"
108124
$ sleep 5
109125
$ docker logs --tail 100 postgres-upgrade-testing
110126

111-
$ # can now safely remove "$OLD"
127+
$ # can now (probably) safely remove "$OLD"
112128
$ sudo rm -rf "$OLD"
113129
```

0 commit comments

Comments
 (0)