結論
docker-entrypoint-initdb.dディレクトリに*.sql
, *.sql.gz
, or *.sh
ファイルを置くと、databaseを作成時に実行してくれます
やりたいこと
開発時docker postgresとAWS RDSの設定が異なるので一致させたい
as is
SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
name | setting | context
-------------+------------+-----------
lc_collate | en_US.utf8 | internal
lc_ctype | en_US.utf8 | internal
lc_messages | en_US.utf8 | superuser
lc_monetary | en_US.utf8 | user
lc_numeric | en_US.utf8 | user
lc_time | en_US.utf8 | user
(6 rows)
to be
SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
name | setting | context
-------------+------------+-----------
lc_collate | en_US.utf8 | internal
lc_ctype | en_US.utf8 | internal
lc_messages | | superuser
lc_monetary | C | user
lc_numeric | C | user
lc_time | C | user
(6 rows)
スクリプトとdocker-compose.ymlの修正
今回はinit_db
ディレクトリ以下にinit_db.sh
ファイルを作成しました。
やっていることはコンテナ内の/var/lib/postgresql/data/postgresql.conf
ファイルの中身をsed
コマンドで書き換えています。
ディレクトリ名はdocker-compose.yml
のvolumesと一致していればなんでもよいです。
#!/bin/bash
# 開発環境用のDocker postgresqlの起動設定を変更する
# 本番DBにあわせた設定にする
set -e
sed -i -e"s/^lc_messages = 'en_US.utf8'.*$//" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s/^lc_monetary = 'en_US.utf8'.*$/lc_monetary = 'C'/" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s/^lc_numeric = 'en_US.utf8'.*$/lc_numeric = 'C'/" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s/^lc_time = 'en_US.utf8'.*$/lc_time = 'C'/" /var/lib/postgresql/data/postgresql.conf
volumesでホストのinit_db
ディレクトリをコンテナのdocker-entrypoint-initdb.d
ディレクトリにマウントします。
これでpostgresイニシアライズ時に↑で作成したスクリプトが実行されます。
postgres:
image: postgres:9.5.15
restart: always
volumes:
- ./tmp/db:/var/lib/postgresql/data
- ./init_db:/docker-entrypoint-initdb.d
データベースを作り直す
どうやら作成し直さないと設定が変更にならない項目もあるようなので、データベースを作成しなおします
sudo rm -rf tmp/db
or
# railsなら
docker-compose run --rm web bin/rails db:drop
それでもうまくいかない場合はいったんimageなども削除したほうがよいかもしれません。
※以下はdockerのimagesを全削除するコマンドです。
docker rmi $(docker images -q) -f
before
SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
name | setting | context
-------------+------------+-----------
lc_collate | en_US.utf8 | internal
lc_ctype | en_US.utf8 | internal
lc_messages | en_US.utf8 | superuser
lc_monetary | en_US.utf8 | user
lc_numeric | en_US.utf8 | user
lc_time | en_US.utf8 | user
(6 rows)
after
SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
name | setting | context
-------------+------------+-----------
lc_collate | en_US.utf8 | internal
lc_ctype | en_US.utf8 | internal
lc_messages | | superuser
lc_monetary | C | user
lc_numeric | C | user
lc_time | C | user
(6 rows)
成功です!