🐼
【Docker】PostgreSQLの起動時に初期データをセットアップしようとするが、うまくいかない場合
結論
docker-compose down -v
を実行しましょう
経緯
docker-compose.ymlは下記
version: '3'
services:
db:
image: postgres:12.8
volumes:
- type: bind
source: "./initialize/create-db-user.sh"
target: "/docker-entrypoint-initdb.d/create-db-user.sh"
container_name: postgres_dev
tty: true
ports:
- 5433:5432
environment:
- POSTGRES_PASSWORD=testpassword
- POSTGRES_USER=hoge
- POSTGRES_DB=hoge
create-db-user.shは下記のようにしていました。
(initファイル等を使用してもいいと思います)
#!/bin/bash
set -e # パイプやサブジェルで実行したコマンドがエラーになったら直ちにジェルを終了する
# postgreSQL用コンテナ作成時にコンテナ内で実行される
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE ROLE hoge_user WITH PASSWORD 'testpassword' LOGIN;
EOSQL
問題点
コンテナに入って、ユーザー確認すると、hoge_userが作成されていない
// コンテナ確認
$docker ps
// コンテナに入る
$docker exec -it <container_name> bash
// postgresに入る
$psql -U hoge
// ユーザー確認
# \du;
// hoge_userが作られてない!
原因
なんで?と思いぐぐってみると、記事を発見。
docker-entrypoint-initdb.d フォルダはコンテナの作成(インスタンス化)中に一度だけ実行されるので、docker-compose down -v
を実行して次の実行のためにこれを再有効化する必要があるみたいです。
[参考]
[docker-compose downの-vオプションについて]
まとめ
docker-compose.ymlを修正したときは、docker-compose down -v
を行ってから、立ち上げ直した方が、無難かもしれません。
Discussion