natural born minority
PostgreSQLのDBは豊富な EXTENSION
があって良い…のですが、これを「フリーズドライ」するのをいつも悩むのです。
EXTENSION
を追加した状態&有効のDockerイメージ作成方法
EXTENSION
を有効にした状態」でのDockerイメージ作成方法たまたま、お仕事で「PostGISを有効にしたPostgreSQLのデータベース」が必要となりまして。
「手動インストールの手段を説明したテキスト」が渡ってきたのですが、絶対やりたくないので、Dockernizeをしておこうかと思い立ちました。
…が、
で、試行錯誤したので備忘を書き留めて置きます。
こちらに一式あります。
「そのものズバリなイメージ」が無く、本家ではない「PostGISをインストールしたImage」は見つかったので、FROMにそれを使い、以下のカタチにアレンジしました。
FROM mdillon/postgis:9.6
MAINTAINER kazuhito_m
# locale settings.
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
# db intial sql's copy.
COPY init_sql/*.sql /docker-entrypoint-initdb.d/
中盤の「locale設定」以外、ほぼ「mdillonさんのイメージのまま」です。
イメージの継承関係は、
です。
最後の COPY
は「本家のイメージには init_sql
へSQLファイルを置いておくと、そこのファイルを取り込んで実行してくれる」という仕組みがあるため、継承先でもそれを踏襲しファイルを取り込むようにしています。
上記の通り「初期実行SQLを仕込める」ので、
init_sql/01_createdb.sql
というファイルを作り、以下のSQLを記述します。
CREATE USER postgis_sample_user WITH SUPERUSER PASSWORD 'postgis_sample_user';
CREATE DATABASE postgis_sample ENCODING 'UTF8' LC_COLLATE 'C' TEMPLATE 'template0' OWNER 'postgis_sample_user';
\connect postgis_sample
CREATE EXTENSION postgis;
CREATE SCHEMA AUTHORIZATION postgis_sample_user;
ユーザ作成、DATABSE作成、スキーマ作成、と順番にやっています。
キモは「PostGISはDATABASE毎に有効にするもの」であるため、中盤で「データベースに接続し有効化」しています。
自分は、だいたい「ローカルテストようのDBは、開発プロジェクトごとにDockerでAsCodeして」います。
PostgreSQLは「公式イメージ」が手厚いので簡易なのですが、「 EXTENSION
が絡むと仕込み方が解らない」という状況になります。
なので、今回みたいな対応がこれからも必要だろうなと思っています。
…複数 EXTENSION
仕込む必要のあるやつが出てきたら、Dockerfile紐解いて合成せなあかん…かも。