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とは
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
DB 接続文字列を環境変数に設定
コンテナ外から接続する場合、以下の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
コンテナ外からコンテナ内のpsqlへ接続
コンテナ外から操作する場合ローカルPCにpsqlを予めインストールする必要がある。
$ psql -h localhost -p 5433 sample_app -U sample_app_user // Password for user sample_app_user: (dockerfiles/docker-compose.yml内部に書かれているパスワードを入力)
Dockerコンテナの中に入り操作する
execコマンドでコンテナの中に入り操作することができる. コンテナ名にはdocker-compose.ymlでservicesで指定した「db」を入力する。
$ docker-compose exec <コンテナ名> bash $ cd app $ docker-compose -f dockerfiles/docker-compose.yml exec db bash 終わる時は、 # exit
dockerコンテナ内でpsql対話モードを起動
コンテナ内のポート番号はdocker-compose.ymlの右側の値を使用する。
# psql -h localhost -p 5432 sample_app_user -U sample_app_user 終わる時は、 # \q