【PostGIS】Dockerを使ってバージョンアップの検証を行う方法

2024/12/19に公開

この記事は、 PLEX Advent Calendar 2024 の 19 日目の記事です。

はじめに

本番環境における PostGIS のバージョンアップ手順の検証を行うにあたり、本番環境と同じ前提条件にするため、PostGIS の default_versioninstalled_version が異なる状態をローカルで再現する必要がありました。

ただ、Docker で postgis/postgis のイメージを使って環境構築すると、default_versioninstalled_version が同じになってしまいました。
色々調べる中で異なるバージョンの状態にすることができたので、Docker 環境で PostGIS の default_versioninstalled_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 にも対応しています。
https://postgis.net/

環境構築

さっそく環境構築していきます。

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_versioninstalled_version ともに 3.3.4 でした。
この後、default_version3.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_versioninstalled_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 のバージョンアップ検証のための環境構築についてまとめました。
かなりニッチなテーマかと思いますが何かの参考になれば嬉しいです!

GitHubで編集を提案

Discussion