概要
DockerコンテナでとあるサービスのPostgreSQLデータベース用のコンテナを作成するとき、
起動後にデータベース作成やらSQL投入するのが面倒だったのでやり方を調査したメモ
やり方
いろいろとやり方はあると思うが、docker-entrypoint.shを使う方法で。
Dockerfile内でENTRYPOINTを設定することで、
任意のスクリプトをコンテナ起動時に実行可能なので、これを活用します。
PostgreSQLの自動起動の前に実行されるため、
明示的にPostgreSQLを起動してから
データベースの作成やSQLの実行を記述する必要があります。
自動起動に影響を与えないように処理完了後にPostgreSQLは停止しています。
2023/02/10追記
ENTRYPOINTはコンテナ作成時だけでなく起動時にも実行されるため、
一度作成後に、コンテナを停止→起動した際にも実行されてしまいます。
結果、二重でSQLを投入しようとするためエラーになってしまいます。
これを解決するために、
実行後にentrypoint実行完了ファイルを作成し、
実行完了ファイルがある場合はSQL関連の操作を実行しないようにします。
コード
Dockerfile
#... 諸々の処理
# 実行SQLファイルをアップロード
ADD ./entrypoint.sql /tmp
# docker-entrypoint.shのアップロードと権限設定
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
# ENTRYPOINT設定
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
docker-entrypoint.sh
#!/bin/bash
set -e
# 一回だけ実行
if [ ! -e /entrypoint-done ]; then
# PostgreSQLサーバーの起動
su - postgres -c "pg_ctl start -D [postgresデータディレクトリ]"
# データベースの作成やSQLの実行(例)
psql -U postgres -c "CREATE DATABASE testdb"
psql -U postgres testdb < /tmp/entrypoint.sql
# PostgreSQLサーバーの停止
su - postgres -c "pg_ctl stop -D [postgresデータディレクトリ]"
fi
# Entrypointの完了ファイルを作成
echo "done" > /entrypoint-done
# コマンドラインに制御を戻す
exec "$@"