【Docker Compose】PostgreSQL起動時のエラー「Database is uninitialized」を解決!
Docker ComposeでPostgreSQL起動時に発生するエラー「Error: Database is uninitialized and superuser password is not specified.」の解決方法
このエラーは、Docker Composeを使ってPostgreSQLコンテナを起動しようとした際に発生します。データベースが初期化されていないことと、スーパーユーザーのパスワードが指定されていないことが原因です。
解決方法
このエラーを解決するには、以下の2つの方法があります。
スーパーユーザーパスワードを環境変数で設定する
以下のコマンドを実行して、POSTGRES_PASSWORD
環境変数にパスワードを設定します。
export POSTGRES_PASSWORD=your_password
docker-compose up -d
Dockerfileで初期化スクリプトを実行する
Dockerfileに以下の内容を追加して、コンテナ起動時に初期化スクリプトを実行します。
FROM postgres:latest
RUN mkdir -p /docker-entrypoint-initdb.d
COPY initdb.sql /docker-entrypoint-initdb.d/
ENV POSTGRES_PASSWORD=your_password
- 初期化スクリプトは、データベースを作成するSQL文を含むファイルです。
- パスワードは、安全なものを設定してください。
- 上記の方法は、PostgreSQL 10以降で使用できます。
- その場合は、それぞれのデータベースのドキュメントを参照してください。
- このエラーは、PostgreSQL以外のデータベースでも発生することがあります。
# パスワードを環境変数に設定
export POSTGRES_PASSWORD=your_password
# Docker Composeを使ってPostgreSQLコンテナを起動
docker-compose up -d
Dockerfile
FROM postgres:latest
RUN mkdir -p /docker-entrypoint-initdb.d
COPY initdb.sql /docker-entrypoint-initdb.d/
ENV POSTGRES_PASSWORD=your_password
initdb.sql
CREATE DATABASE my_database;
使用方法
initdb.sql
ファイルに、データベースを作成するSQL文を記述します。- 上記の Dockerfile を使用して、PostgreSQL イメージをビルドします。
- 以下のコマンドを実行して、Docker Composeを使ってPostgreSQLコンテナを起動します。
docker-compose up -d
- 状況に合わせて、適宜変更してください。
他の方法
以下のコマンドを実行して、docker run
コマンドでパスワードを直接指定できます。
docker run -e POSTGRES_PASSWORD=your_password -d postgres
POSTGRES_HOST_AUTH_METHOD 環境変数を使用して、パスワード認証を無効化する
注意: この方法は、セキュリティ上問題があるため、本番環境では使用しないでください。
export POSTGRES_HOST_AUTH_METHOD=trust
docker-compose up -d
環境変数ファイルを使用する
環境変数ファイルを使用して、パスワードなどの環境変数を設定することができます。
以下の手順で、環境変数ファイルを使用することができます。
.env
ファイルを作成します。.env
ファイルに以下の内容を記述します。
POSTGRES_PASSWORD=your_password
docker-compose up -d
Docker Swarm を使用する
Docker Swarm を使用すると、複数のコンテナを管理することができます。
Docker Swarm を使用して、PostgreSQL コンテナを起動するには、以下の手順が必要です。
- Docker Swarm を初期化します。
- 以下のコマンドを実行して、PostgreSQL サービスをデプロイします。
docker swarm service create \
--name postgres \
--replicas 1 \
-e POSTGRES_PASSWORD=your_password \
postgres
postgresql docker docker-compose