docker-composeでPostgresSQLのコンテナを起動する

#Docker
#docker-compose
#PostgresSQL

 

dockerのコンテナに仮想のデータベースを立てることでDBの操作テストをしてみたい時やユニットテストの作成など様々なシーンで活用できる。 初期化したりやり直したい時などコンテナを削除して再作成するだけなので気楽に操作できるところが良いところです。

 

ディレクトリ構成

app/ └dockerfiles/ ├ docker-entrypoint-initdb.d/ │ └ init.sql └ docker-compose.yml

 

docker-compose.yml

version: "3" services: db: image: postgres:11 environment: POSTGRES_USER: sample_app_user POSTGRES_PASSWORD: sample_app_user_password POSTGRES_DB: sample_app ports: - "5433:5432" volumes: - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

docker-entrypoint-initdb.dディレクトリにsqlファイルを設置することでDB立ち上げの際、自動で実行してくれる。

 

init.sql

ALTER DATABASE sample_app OWNER TO sample_app_user; ALTER ROLE sample_app_user WITH CREATEDB; ALTER ROLE sample_app_user WITH PASSWORD 'sample_app_user_password'; GRANT ALL ON ALL TABLES IN SCHEMA public TO sample_app_user;

 

docker-compose upコマンドをappディレクトリで入力することでdocker-compose.ymlを読み込みコンテナを立ち上げることができる。今回は-fでパスを含めて指定している。

$ cd app/ $ docker-compose -f dockerfiles/docker-compose.yml up -d

 

立ち上がったらps -aコマンドで確認、statusがupとなっていたら立ち上がっている。

$ docker ps -a

 

コンテナ外から接続する場合、以下のURLを環境変数などに仕込んで接続する URLは、

postgresql://<user名>:<パスワード>@localhost:<ymlの左側のport番号>/<データベース名>

$ cd app $ touch .env $ echo 'DATABASE_URL="postgresql://sample_app_user:sample_app_user_password@localhost:5433/sample_app"' > .env

 

コンテナ外から操作する場合ローカルPCにpsqlを予めインストールする必要がある。

$ psql -h localhost -p 5433 sample_app -U sample_app_user // Password for user sample_app_user: (dockerfiles/docker-compose.yml内部に書かれているパスワードを入力)

 

execコマンドでコンテナの中に入り操作することができる. コンテナ名にはdocker-compose.ymlでservicesで指定した「db」を入力する。

$ docker-compose exec <コンテナ名> bash $ cd app $ docker-compose -f dockerfiles/docker-compose.yml exec db bash 終わる時は、 # exit

コンテナ内のポート番号はdocker-compose.ymlの右側の値を使用する。

# psql -h localhost -p 5432 sample_app_user -U sample_app_user 終わる時は、 # \q