0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Docker】コンテナ作成時にデータベース作成して任意のSQLを実行させたい ※ 20230210追記あり

Last updated at Posted at 2023-02-08

概要

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 "$@"
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?