インフラ・DevOps
Show HN: Pglayers – スタック可能なDockerレイヤーとしてのPostgreSQL拡張機能
Show HN: Pglayers – PostgreSQL extensions as stackable Docker layers (github.com)
要約
Pglayersは、PostgreSQLの公式Dockerイメージに拡張機能を簡単に追加できるようにするツールです。通常、PostgreSQLの拡張機能は手動でのインストールやコンパイルが必要ですが、Pglayersは各拡張機能を最小限のDockerイメージレイヤーとして提供し、`COPY --from`コマンドで既存のPostgreSQLイメージに積み重ねるだけで利用できます。これにより、PostGIS、pgvector、pg_cronなどの多様な拡張機能を簡単にカスタムイメージに追加し、開発およびテストプロセスを効率化できます。
全文翻訳
pglayers
公式のPostgreSQL Dockerイメージは拡張機能なしで提供されます。pgvector、PostGIS、またはpg_cronが必要になるたびに、手動で依存関係をインストールしたり、ソースからコンパイルしたり、固定された拡張機能のセットをバンドルするサードパーティのイメージに甘んじたりすることになります。pglayersはこれを解決します。これは、拡張機能がプリインストールされたすぐに使えるPostgreSQLディストリビューションであると同時に、公式のpostgres Dockerイメージをベースにして、必要な拡張機能だけを含む独自のカスタムイメージを構築するためのツールでもあります。PostgreSQL拡張機能の構築方法、依存関係のインストール方法、コンパイラのセットアップ方法を考える必要はありません。各拡張機能は、そのバイナリのみを含む最小限のDockerイメージレイヤーとして公開されています。公式のpostgresイメージの上に`COPY --from`を使用してそれらを積み重ねます — 拡張機能ごとに1行、コンパイルは不要です。
クイックスタート
オプション1: すぐに使えるイメージ
`shared_preload_libraries`がすでに設定されている、事前ビルドされた結合イメージ:
```bash
# 全53拡張機能
docker run -d -e POSTGRES_PASSWORD=secret ghcr.io/pglayers/pglayers-full:17
# Azure Database for PostgreSQL互換 (28拡張機能)
docker run -d -e POSTGRES_PASSWORD=secret ghcr.io/pglayers/pglayers-azure:17
```
利用可能なプロファイル: full、azure。それぞれPG 17、18、19用に公開されています。詳細とカスタムプロファイルの作成方法については、[プロファイル](#profiles)を参照してください。
注: ベンダープロファイル(例: azure)は、ローカル開発のためのベストエフォートな近似値です。実際のマネージドサービスに代わるものではありません — 拡張機能のバージョン、構成のデフォルト値、プラットフォーム固有の動作が異なる場合があります。これらはローカルで開発およびテストするために使用し、本番環境を正確に複製するためには使用しないでください。
オプション2: 独自の拡張機能を選択する
各拡張機能は独自のイメージレイヤーとして公開されています。これらを`COPY --from`を使用して公式のpostgresイメージに積み重ねます — 各行は最終イメージに1つの拡張機能を追加します:
```dockerfile
FROM postgres:17
COPY --from=ghcr.io/pglayers/pgx-pgvector:17 / /
COPY --from=ghcr.io/pglayers/pgx-pg_cron:17 / /
COPY --from=ghcr.io/pglayers/pgx-postgis:17 / /
```
ビルドして実行:
```bash
docker build -t my-postgres .
docker run -d -e POSTGRES_PASSWORD=secret my-postgres
```
コンパイルは行われません — Dockerはレジストリから事前にビルドされた拡張機能レイヤーをプルし、それらを公式イメージにオーバーレイします。その結果、選択した拡張機能のみを含む単一のイメージがレイヤーごとに構成されます。
Dockerを初めて使用しますか?コンテナが実行されているかを確認し、ポートの競合を処理する方法については、[コンテナの検証](#verifying-your-container)を参照してください。
サポートされているPostgreSQLバージョン
バージョン | ステータス
---|---
PostgreSQL 17 | 安定版
PostgreSQL 18 | 安定版
PostgreSQL 19 | 実験版 (ベータ版 — 正式リリースまでサポート)
すべての拡張機能はPG 17および18に対してビルドされ、テストされています。PG 19のサポートは、ベータ版である間はベストエフォートであり、一部の拡張機能はまだアップストリームの互換性がない場合があります。PG 19がGAに達すると、安定版に昇格されます。
利用可能な拡張機能
拡張機能 | バージョン | PGバージョン | 説明
---|---|---|---
age | 1.7.0-rc0 | 17, 18 | openCypherクエリ言語を備えたグラフデータベース (Apache AGE)
anon | 3.1.1 | 17, 18 | データ匿名化およびマスキング
credcheck | 5.0 | 17, 18, 19 | ユーザー作成時/パスワード変更時の認証情報チェック
documentdb | 0.113-0 | 17, 18 | MongoDB互換のドキュメントデータベースエンジン (BSONタイプとCRUD API)
h3-pg | 4.2.3 | 17, 18 | Uber H3六角形地理空間インデックス
hll | 2.21 | 17, 18, 19 | HyperLogLog確率的ユニークカウント
http | 1.7.1 | 17, 18, 19 | PostgreSQL用HTTPクライアント (SQLからのWebリクエスト)
hypopg | 1.4.3 | 17, 18, 19 | What-if分析のための仮説インデックス
ip4r | 2.4.3 | 17, 18, 19 | GiSTインデックス付きIPv4/IPv6レンジデータ型
orafce | 4.16.7 | 17, 18, 19 | Oracle互換関数およびパッケージ
pgaudit | 17.1 | 17, 18 | 監査ログ (セッションおよびオブジェクトレベル)
pg_bigm | 1.2 | 17, 18 | 2-gram全文検索 (CJK言語に最適)
pg_cron | 1.6.7 | 17, 18 | ジョブスケジューラ (データベース内の定期的ジョブ)
pg_duckdb | 1.1.1 | 17, 18 | Postgresに埋め込まれたDuckDBカラム型分析エンジン
pg_durable | 0.2.3 | 17, 18 | データベース内永続実行 (フォールトトレラントなワークフロー)
pg_failover_slots | 1.2.1 | 17, 18 | フェールオーバー用の論理レプリケーションスロットマネージャ
pg_graphql | 1.6.1 | 17, 18 | PostgreSQL用GraphQLサポート
pg_hashids | 1.2.1 | 17, 18, 19 | 整数から短いユニークハッシュIDを生成
pg_hint_plan | 1.7.1 | 17, 18 | SQLコメント内のヒントを使用して実行プランを調整
pg_ivm | 1.13 | 17, 18 | マテリアライズドビューのインクリメンタルビューメンテナンス
pg_jsonschema | 0.3.4 | 17, 18 | JSONスキーマ検証
pg_net | 0.20.3 | 17, 18, 19 | 非同期非ブロックHTTP/HTTPSリクエスト
pg_partman | 5.4.3 | 17, 18, 19 | 自動テーブルパーティション管理
pg_qualstats | 2.1.4 | 17, 18, 19 | WHERE句述語の統計コレクタ
pg_repack | 1.5.3 | 17, 18, 19 | 重いロックなしでのオンラインテーブル再編成
pg_roaringbitmap | 1.1.0 | 17, 18 | 高速セット操作用のRoaringビットマップデータ型
pg_similarity | 1.0 | 17, 18 | 類似性関数 (Levenshtein, Jaro-Winkler, Cosine, Jaccard)
pg_squeeze | 1.9.3 | 17, 18, 19 | 重いロックなしでテーブルから未使用スペースを削除
pg_stat_monitor | 2.3.2 | 17, 18 | ヒストグラムとバケットによる拡張クエリ統計
pg_textsearch | 1.3.1 | 17, 18 | BM25関連度ランク付き全文検索
pg_uuidv7 | 1.7.0 | 17, 18, 19 | UUIDv7生成 (時間順ソート可能なユニーク識別子)
pg_wait_sampling | 1.1.9 | 17, 18, 19 | 待機イベントのサンプリングベース統計
pgfincore | 1.4.0 | 17, 18, 19 | データファイル用のOSページキャッシュを検査および管理
pgjwt | master | 17, 18, 19 | JSON Web Token (JWT) 生成および検証
pglogical | 2.4.7 | 17, 18, 19 | パブリッシュ/サブスクライブモデルを使用した論理ストリーミングレプリケーション
pgrouting | 4.0.1 | 17, 18, 19 | PostGIS上の地理空間ルーティングおよびネットワーク分析
pgsodium | 3.1.11 | 17, 18, 19 | libsodiumを使用したモダンな暗号化
pgtap | 1.3.4 | 17, 18, 19 | PostgreSQL用ユニットテストフレームワーク
pgtt | 4.5 | 17, 18, 19 | Oracleスタイルのグローバル一時テーブル
pgvector | 0.8.3 | 17, 18, 19 | AI/埋め込み用のベクトル類似性検索
plpgsql_check | 2.9.1 | 17, 18, 19 | PL/pgSQLリンターおよびバリデーター
plprofiler | 4.2.5 | 17, 18 | PL/pgSQL関数用パフォーマンスプロファイラ
plv8 | 3.2.4 | 17, 18 | JavaScript (V8) 手続き型言語
PostGIS | 3.6.4 | 17, 18, 19 | 地理空間拡張機能 (ジオメトリ、ジオグラフィー、ラスタ、MVT)
postgres_protobuf | 0.3.2 | 17, 18, 19 | Protocol Bufferサポート (クエリ、JSONとの変換)
prefix | 1.2.11 | 17, 18, 19 | 電話ルーティングルックアップ用のプレフィックスレンジデータ型
rum | 1.3.15 | 17, 18 | 全文検索用の順序付け付きGINライクインデックス
semver | 0.41.0 | 17, 18, 19 | セマンティックバージョンデータ型
tdigest | 1.4.3 | 17, 18, 19 | クォンタイルおよびパーセンタイル推定用のT-ダイジェスト
tds_fdw | 2.0.5 | 17, 18 | SQL ServerおよびSybase用外部データラッパー
temporal_tables | 1.2.2 | 17, 18 | システム期間テンポラルテーブル
timescaledb | 2.28.1 | 17, 18 | 時系列ハイパーテーブル、圧縮、連続集計
wal2json | 2.6 | 17, 18 | 論理レプリケーション/CDC用JSON出力プラグイン
wrappers | 0.6.2 | 17, 18 | 外部データラッパーフレームワーク (Stripe, S3, Firebaseなど)
イメージタグ
各拡張機能は、2つのタグ形式で公開されています。
* `pgx-<extension>:<pg_major>` -- 最新ビルド (例: `pgx-pgvector:17`)
* `pgx-<extension>:<pg_major>-<version>` -- 固定バージョン (例: `pgx-pgvector:17-v0.8.3`)
すべてのイメージはマルチアーキテクチャ (linux/amd64およびlinux/arm64) であり、GHCRの`ghcr.io/pglayers/pgx-*`でホストされています。Dockerはプラットフォームに応じて正しいアーキテクチャを自動的にプルします。
構成に関する注意点
shared_preload_libraries
一部の拡張機能では、`shared_preload_libraries`にエントリが必要です。`COPY`行の後にこれをDockerfileに追加します:
```dockerfile
RUN echo "shared_preload_libraries = 'pg_cron,pgaudit,pg_partman_bgw'" \
>> /usr/share/postgresql/postgresql.conf.sample
```
これが必要な拡張機能:
拡張機能 | ライブラリ名
---|---
age | age
anon | anon
credcheck | credcheck
pg_cron | pg_cron
pg_duckdb | pg_duckdb
pg_durable | pg_durable
pg_failover_slots | pg_failover_slots
pg_hint_plan | pg_hint_plan
pg_net | pg_net
pg_partman | pg_partman_bgw
pg_qualstats | pg_qualstats
pg_squeeze | pg_squeeze
pg_stat_monitor | pg_stat_monitor
pg_textsearch | pg_textsearch
pg_wait_sampling | pg_wait_sampling
pgaudit | pgaudit
pglogical | pglogical
pgsodium | pgsodium
pgtt | pgtt
plprofiler | plprofiler
timescaledb | timescaledb
CREATE EXTENSION
拡張機能は、使用したい各データベースで作成する必要があります。これを初期化スクリプトで自動化できます:
```bash
COPY <<'EOF' /d
```