LoginSignup
2
2

dockerでPostgreSQLを使うときに、ビルドが必要な拡張機能(Extension)を導入する

Posted at

はじめに

タイトルの通り。
ビルドのタイミングだったり、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つがあるみたい
    1. デフォルトでPostgreSQLに入っているもの(CREATE EXTENSION だけすればよいもの)
    2. Linuxのパッケージとしてインストールできるもの(aptyum等で取得したあとにCREATE EXTENSIONするもの )
    3. ソースをビルドしてインストールがひつようなもの(今回の対象)
  • 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 は マテリアライズドビューを自動更新するという、結構面白そうな拡張機能です。

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2