Docker Postgres を使用してデータベース ユーザーを作成する
- 新しいプロジェクトを作成する
- ユーザーとデータベースの DDL を定義する
- イメージの Dockerfile を定義する
- イメージを構築する
- コンテナを実行する
- コンテナに接続
- PostgreSQL へのログイン
- スクリプト ファイルを使用しないユーザー データベースの作成
- まとめ
アプリケーションを開発するときは、通常、PostgreSQL、MySQL、MongoDB などのデータベース管理システムを使用して、アプリケーションのデータを記録します。
Docker は、これらのアプリケーション データベース管理システムのインスタンスを実行するのに役立ちます。 これにより、コンピューター上に DBMS が必要ないため、時間とコンピューターのストレージを節約できます。
これらの DBMS から作成されたすべてのデータベースには、データベースに対して異なる権限を持つユーザーがいます。 このチュートリアルでは、Docker Postgres を使用してデータベース ユーザーを作成するためのさまざまなアプローチを学習します。
新しいプロジェクトを作成する
このチュートリアルでは、WebStorm IDE を使用しますが、任意の開発環境を自由に使用できます。 WebStorm IDE を開き、File
> New
> Project
を選択して新しいプロジェクトを作成します。
Empty project
オプションを選択し、開いたウィンドウで、プロジェクト名を untitled
から initdb.d
に変更するか、任意の名前を使用します。
ユーザーとデータベースの DDL を定義する
PostgreSQL ベース イメージを使用してカスタム イメージに追加の初期化を追加するには、フォルダー /docker-entrypoint-initdb.d の下に
.sql、
.sql.gz、または
*.shを追加する必要があります。
.
SQL クエリを作成したいので、拡張子 .sql
のファイルを使用してクエリを定義します。 プロジェクトの現在のフォルダーの下に db-config.sql
という名前のファイルを作成し、次の SQL 命令をコピーしてファイルに貼り付けます。
CREATE USER doe;
CREATE DATABASE employee_database;
GRANT ALL PRIVILEGES ON DATABASE employee_database TO doe;
db-config.sql
は、エントリ ポイントが initdb
を呼び出してデフォルトの Postgres
ユーザーとデータベースを作成した後に実行されます。
/docker-entrypoint-initdb.d
のスクリプトは、データ ディレクトリが空の場合にのみ実行されることに注意してください。 これは、起動時に、これより前に実行されたデータベースは変更されないことを意味します。
イメージの Dockerfile を定義する
現在のフォルダーの下にDockerfile
という名前のファイルを作成し、次の手順をコピーしてファイルに貼り付けます。
FROM postgres:15.1-alpine
COPY db-config.sql /docker-entrypoint-initdb.d/
FROM
- 以降の手順を使用してカスタム イメージを作成するベース イメージを定義します。 この場合、alpine
を使用しました。これは、PostgreSQL の軽量バージョンであるため、ストレージを最適化するのに役立ちます。
COPY
- ファイルとフォルダをホストからイメージ ファイル システムにコピーします。 この場合、db-config.sql
ファイルを /docker-entrypoint-initdb.d/
フォルダーにコピーしました。
イメージを構築する
キーボードのキーボード ショートカット ALTF12 を使用して新しいターミナル ウィンドウを開き、次のコマンドを使用してタグ postgres-image
でイメージをビルドします。
~/WebstormProjects/initdb.d$ docker build --tag postgres-image:latest .
出力:
=> [1/2] FROM docker.io/library/postgres:15.1-alpine@sha256:cc663286e63810373bdfc91a5ed24b772447fb5282d 0.0s
=> CACHED [2/2] COPY db-config.sql /docker-entrypoint-initdb.d/ 0.0s
=> exporting to image 0.4s
=> => exporting layers 0.0s
=> => writing image sha256:fd33d80c880452dcb25de1d8f7d6415eeb874039bdab176cc3d3fe1c910ebcbc 0.1s
=> => naming to docker.io/library/postgres-image:latest
コンテナを実行する
同じターミナル ウィンドウを使用して、次のコマンドを使用して postgres-container
という名前の PostgreSQL コンテナーを実行します。
~/WebstormProjects/initdb.d$ docker run --name postgres-container -e POSTGRES_PASSWORD=postgres -d postgres-image
出力:
3b8e0f85c2b4ef4b1aa28e2bad169ae796751331580af6fbba251a1c05aa4fca
run
コマンドで POSTGRES_PASSWORD
という名前の環境変数を使用したことに注意してください。 PostgreSQL を実行している場合、いくつかの環境変数を渡して、データベースやユーザー名などのスーパーユーザーの詳細を提供できます。
POSTGRES_PASSWORD
環境変数は、スーパーユーザーのパスワードを提供する 必須
変数です。 PostgreSQL のデフォルトのパスワードは postgres
です。
渡すことができるその他の環境変数は、optional
で、これには POSTGRES_USER
、POSTGRES_DB
、POSTGRES_INITDB_ARGS
などが含まれます。
コンテナーをデタッチ モードで実行しているため、db-config.sql
ファイルの実行を確認できません。 ただし、このファイルはスーパーユーザーによって裏で実行されます。
コンテナに接続
新しいユーザーとデータベースを使用して PostgreSQL にログインできるように、インタラクティブ シェルを使用してコンテナーに接続する必要があります。 これを実現するには、次のコマンドを使用してコンテナーに接続します。
~/WebstormProjects/initdb.d$ docker exec -it postgres-container bash
出力:
bash-5.1#
PostgreSQL へのログイン
コンテナーのシェルにアクセスしたら、次のコマンドを使用して、ユーザー doe
として employee_database
にログインします。
bash-5.1# psql -d employee_database -U doe
出力:
psql (15.1)
Type "help" for help.
employee_database=>
スクリプト ファイルを使用しないユーザー データベースの作成
前のセクションでは、DDL を含む SQL を /docker-entrypoint-initdb.d/
に追加して、Docker Postgres でデータベース ユーザーを作成する方法を学びました。
スクリプト ファイルを作成せずにこれを行う簡単な方法があります。 このアプローチでは、前のセクションで説明した環境変数を使用して、新しいユーザーの詳細を定義します。
これらの環境変数は、ENV
命令を使用して Dockerfile
に追加され、コンテナーで使用できるようになります。 これを実際に確認するには、Dockerfile
の手順を以下の手順に置き換えてください。
FROM postgres:15.1-alpine
ENV POSTGRES_USER=doe
ENV POSTGRES_DB=employee_database
環境変数を追加したら、イメージの構築、コンテナーの実行、コンテナーへの接続、PostgreSQL へのログインから、前のセクションで説明したすべての手順を繰り返します。
すべてのステップで同じコマンドを使用します。 ただし、必ず既存のコンテナーを停止して削除してください。
新しいイメージとコンテナーを作成することもできます。
まとめ
このチュートリアルでは、Docker Postgres でデータベース ユーザーを作成するために使用できる 2つのアプローチを学びました。 最初のアプローチでは、SQL スクリプトを /docker-entrypoint-initdb.d/
に追加してユーザーを作成し、このファイルは initdb
の初期化中に実行されました。
2 番目のアプローチでは、Docker Postgres 環境変数を利用して、Dockerfile
でユーザーの詳細を定義しました。
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub