はじめに
タイトルの通り。
ビルドのタイミングだったり、SQLファイルを特定の場所にコピーする等、意外とやったことないことが多かったので書き残しメモ。
確認環境
- WSL2(Ubuntu22.04.3 LTS)
- PostgreSQL 14.10-1
- Docker (24.0.6)
- pg_ivm(導入するextension)
フォルダ構成
--
[projectfolder]
├─ compose.yml
├─ Dockerfile
└─ docker-entrypoint-initdb.d
└─ 90_pg_ivm.sql (extentionを登録するSQL)
ソース
compose.yml
services:
db:
build:
context: .
restart: always
volumes:
- postgresql:/var/lib/postgresql/data
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
tty: true
volumes:
postgresql:
Dockerfile
# postgresのバージョン14最新
from postgres:14
# パッケージ更新&パッケージのビルドで必要なもの
RUN apt-get update && apt-get install -y \
git \
make \
gcc \
postgresql-server-dev-14
# 必要なパッケージのインストール
# ------ pg_ivm導入
# git展開フォルダ
WORKDIR /tmp
# git で取得
RUN git clone https://github.com/sraoss/pg_ivm
# フォルダ移動
WORKDIR /tmp/pg_ivm
# make & install
RUN make USE_PGXS=1
RUN make USE_PGXS=1 install
# EXTENTION登録SQLをコピー
COPY ./docker-entrypoint-initdb.d/90_pg_ivm.sql /docker-entrypoint-initdb.d
# (一応)ディレクトリはデフォルトに戻す
WORKDIR /
# 使わないので削除
RUN apt-get purge -y \
git \
make \
gcc \
postgresql-server-dev-14
# ファイルも使わないので一応削除
RUN rm -rf /tmp/pg_ivm
docker-entrypoint-initdb.d / 90_pg_ivm.sql
CREATE EXTENSION IF NOT EXISTS pg_ivm;
起動コマンド
docker compose up -d
ざっくり解説
- Dockerfileでビルドして、拡張機能登録用のSQLファイルを/docker-entrypoint-initdb.d にコピーしてコンテナ作成時に実行している(バインドマウントでフォルダ共有しても良い)
- Extensionには、以下の3つがあるみたい
- デフォルトでPostgreSQLに入っているもの(
CREATE EXTENSION
だけすればよいもの) - Linuxのパッケージとしてインストールできるもの(
apt
やyum
等で取得したあとにCREATE EXTENSION
するもの ) - ソースをビルドしてインストールがひつようなもの(
今回の対象
)
- デフォルトでPostgreSQLに入っているもの(
- docker-entrypoint-initdb.d で make はできない(makeの実行ユーザーがpostgresユーザーになるため、permissionエラーとなる)
Extensionが導入されているかの確認
postgres=# SELECT * FROM pg_extension;
oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+---------+----------+--------------+----------------+------------+-----------+--------------
13766 | plpgsql | 10 | 11 | f | 1.0 | |
16384 | pg_ivm | 10 | 11 | f | 1.7 | {16386} | {""}
おまけ
SELECT * FROM pg_available_extensions;
とすると、導入可能(CREATE EXTENSION
だけすればよいもの)と導入済みのextension一覧が表示される(導入済みのものは、installed_version
に値が入っている)
終わりに
拡張機能を自身で導入したことなかったので、色々調べるとこになり、結構勉強になりました。
pg_ivm は マテリアライズドビューを自動更新するという、結構面白そうな拡張機能です。
参考