🐼

【Docker】PostgreSQLの起動時に初期データをセットアップしようとするが、うまくいかない場合

2022/03/20に公開

結論

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を実行して次の実行のためにこれを再有効化する必要があるみたいです。

[参考]
https://stackoverflow.com/questions/53249276/docker-compose-mysql-init-sql-is-not-executed

[docker-compose downの-vオプションについて]
https://docs.docker.com/compose/reference/down/

まとめ

docker-compose.ymlを修正したときは、docker-compose down -vを行ってから、立ち上げ直した方が、無難かもしれません。

Discussion