【PostGIS】Dockerを使ってバージョンアップの検証を行う方法
この記事は、 PLEX Advent Calendar 2024 の 19 日目の記事です。
はじめに
本番環境における PostGIS のバージョンアップ手順の検証を行うにあたり、本番環境と同じ前提条件にするため、PostGIS の default_version
と installed_version
が異なる状態をローカルで再現する必要がありました。
ただ、Docker で postgis/postgis のイメージを使って環境構築すると、default_version
と installed_version
が同じになってしまいました。
色々調べる中で異なるバージョンの状態にすることができたので、Docker 環境で PostGIS の default_version
と installed_version
を異なる状態にする方法についてまとめます。
目指す状態はこちら ↓
name | default_version | installed_version | comment
---------+-----------------+-------------------+------------------------------------------------------------
postgis | 3.5.0 | 3.3.4 | PostGIS geometry and geography spatial types and functions
※ AWS の Managing spatial data with the PostGIS extension のドキュメント内でも触れられてました
PostGIS とは
PostGIS は、PostgreSQL に空間データ型や空間関数を追加する拡張機能です。
2024 年 12 月 19 日現在、PostGIS の最新の安定版は 3.5.0 で、PostgreSQL の 17 にも対応しています。
環境構築
さっそく環境構築していきます。
Docker のコンテナを立ち上げる
compose.yml の中身です。
services:
db:
image: postgis/postgis:15-3.3
platform: linux/amd64
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: postgres
ports:
- "5432:5432"
コンテナを立ち上げます。
docker compose up -d
PostGIS のバージョンを確認する
まず、PostGIS のバージョンを確認しておきます。
docker-compose exec db bash
psql -U postgres -d postgres
postgres=# SELECT * FROM pg_available_extensions WHERE name = 'postgis';
name | default_version | installed_version | comment
---------+-----------------+-------------------+------------------------------------------------------------
postgis | 3.3.4 | 3.3.4 | PostGIS geometry and geography spatial types and functions
default_version
、installed_version
ともに 3.3.4 でした。
この後、default_version
を 3.5.0 にアップデートします。
※ 以下、全て db のコンテナ内で作業
default_version をアップデートする
まず、PostGIS で利用可能なバージョンを確認します。
root@b085d9d32562:/# apt-cache policy postgresql-15-postgis-3
postgresql-15-postgis-3:
Installed: 3.3.4+dfsg-1.pgdg110+1
Candidate: 3.3.4+dfsg-1.pgdg110+1
Version table:
*** 3.3.4+dfsg-1.pgdg110+1 100
100 /var/lib/dpkg/status
3.3.4 しか出てこないので、以下の手順で 3.5.0 をインストールしていきます。
1. インストール可能なパッケージの「一覧」を更新する
root@b085d9d32562:/# apt-get update
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://deb.debian.org/debian-security bullseye-security InRelease [27.2 kB]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:4 http://deb.debian.org/debian bullseye/main amd64 Packages [8,066 kB]
Get:5 http://apt.postgresql.org/pub/repos/apt bullseye-pgdg InRelease [129 kB]
Get:6 http://deb.debian.org/debian-security bullseye-security/main amd64 Packages [327 kB]
Get:7 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [18.8 kB]
Get:8 http://apt.postgresql.org/pub/repos/apt bullseye-pgdg/15 amd64 Packages [2,578 B]
Get:9 http://apt.postgresql.org/pub/repos/apt bullseye-pgdg/main amd64 Packages [366 kB]
Fetched 9,097 kB in 5s (1,887 kB/s)
Reading package lists... Done
2. 再度、PostGIS で利用可能なバージョンを確認する
root@b085d9d32562:/# apt-cache policy postgresql-15-postgis-3
postgresql-15-postgis-3:
Installed: 3.3.4+dfsg-1.pgdg110+1
Candidate: 3.5.0+dfsg-1.pgdg110+1
Version table:
3.5.0+dfsg-1.pgdg110+1 500
500 http://apt.postgresql.org/pub/repos/apt bullseye-pgdg/main amd64 Packages
*** 3.3.4+dfsg-1.pgdg110+1 100
100 /var/lib/dpkg/status
3.5.0 が利用可能になりました。
3. 3.5.0 をインストールする
root@b085d9d32562:/# apt-get install postgresql-15-postgis-3=3.5.0+dfsg-1.pgdg110+1
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Suggested packages:
postgis
The following packages will be upgraded:
postgresql-15-postgis-3
1 upgraded, 0 newly installed, 0 to remove and 66 not upgraded.
Need to get 3,687 kB of archives.
After this operation, 657 kB disk space will be freed.
Get:1 http://apt.postgresql.org/pub/repos/apt bullseye-pgdg/main amd64 postgresql-15-postgis-3 amd64 3.5.0+dfsg-1.pgdg110+1 [3,687 kB]
Fetched 3,687 kB in 5s (792 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
(Reading database ... 14010 files and directories currently installed.)
Preparing to unpack .../postgresql-15-postgis-3_3.5.0+dfsg-1.pgdg110+1_amd64.deb ...
Unpacking postgresql-15-postgis-3 (3.5.0+dfsg-1.pgdg110+1) over (3.3.4+dfsg-1.pgdg110+1) ...
Setting up postgresql-15-postgis-3 (3.5.0+dfsg-1.pgdg110+1) ...
4. インストールできたか確認する
root@b085d9d32562:/# dpkg -l | grep postgis
ii postgresql-15-postgis-3 3.5.0+dfsg-1.pgdg110+1 amd64 Geographic objects support for PostgreSQL 15
ii postgresql-15-postgis-3-scripts 3.3.4+dfsg-1.pgdg110+1 all Geographic objects support for PostgreSQL 15 -- SQL scripts
インストールできました。
default_version
を変更するにはスクリプトも必要なので、3.5.0 のスクリプトもインストールします。
5. 新しいバージョンのスクリプトをインストールする
root@b085d9d32562:/# apt-get install postgresql-15-postgis-3-scripts=3.5.0+dfsg-1.pgdg110+1
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be upgraded:
postgresql-15-postgis-3-scripts
1 upgraded, 0 newly installed, 0 to remove and 65 not upgraded.
Need to get 1,299 kB of archives.
After this operation, 1,328 kB disk space will be freed.
Get:1 http://apt.postgresql.org/pub/repos/apt bullseye-pgdg/main amd64 postgresql-15-postgis-3-scripts all 3.5.0+dfsg-1.pgdg110+1 [1,299 kB]
Fetched 1,299 kB in 3s (509 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
(Reading database ... 14012 files and directories currently installed.)
Preparing to unpack .../postgresql-15-postgis-3-scripts_3.5.0+dfsg-1.pgdg110+1_all.deb ...
Unpacking postgresql-15-postgis-3-scripts (3.5.0+dfsg-1.pgdg110+1) over (3.3.4+dfsg-1.pgdg110+1) ...
Setting up postgresql-15-postgis-3-scripts (3.5.0+dfsg-1.pgdg110+1) ...
Processing triggers for postgresql-common (253.pgdg110+1) ...
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 78.)
debconf: falling back to frontend: Readline
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
6. スクリプトがインストールできたか確認する
root@b085d9d32562:/# dpkg -l | grep postgis
ii postgresql-15-postgis-3 3.5.0+dfsg-1.pgdg110+1 amd64 Geographic objects support for PostgreSQL 15
ii postgresql-15-postgis-3-scripts 3.5.0+dfsg-1.pgdg110+1 all Geographic objects support for PostgreSQL 15 -- SQL scripts
スクリプトも 3.5.0 に変わりました。
7.default_version が上がったかどうか確認する
postgres=# SELECT * FROM pg_available_extensions WHERE name = 'postgis';
name | default_version | installed_version | comment
---------+-----------------+-------------------+------------------------------------------------------------
postgis | 3.5.0 | 3.3.4 | PostGIS geometry and geography spatial types and functions
(1 row)
default_version
が 3.3.4 → 3.5.0 に変更されています。
ここまでの手順で、冒頭目標としていた default_version
と installed_version
でバージョンが異なる状態を再現することができました!
せっかくなのでこの流れでバージョンアップできるかも試してみます。
PostGIS をバージョンアップする
1. PostGIS のバージョンを上げる
アップデートは公式ドキュメントに書かれてある方法で行います。
postgres=# SELECT PostGIS_Extensions_Upgrade();
NOTICE: Updating extension postgis 3.3.4
NOTICE: Updating extension postgis_topology 3.3.4
NOTICE: Updating extension postgis_tiger_geocoder 3.3.4
postgis_extensions_upgrade
------------------------------------------------------------------------------------
Upgrade to version 3.5.0 completed, run SELECT postgis_full_version(); for details
(1 row)
2. installed_version が上がったか確認する
postgres=# SELECT * FROM pg_available_extensions WHERE name = 'postgis';
name | default_version | installed_version | comment
---------+-----------------+-------------------+------------------------------------------------------------
postgis | 3.5.0 | 3.5.0 | PostGIS geometry and geography spatial types and functions
(1 row)
無事、installed_version
が 3.5.0 に変わりました。
さいごに
今回の記事では、PostGIS のバージョンアップ検証のための環境構築についてまとめました。
かなりニッチなテーマかと思いますが何かの参考になれば嬉しいです!
Discussion