docker-compose
で DB とアプリサーバのコンテナを管理する際に、両者を接続するための方法に関しての備忘録です。
構成#
必要最低限の構成のみ記します。
ファイルの中身#
Rust 関連のファイルの内容に関しては省略します。
DB は Postgres を使用し、アプリサーバには Rust で diesel を用いて DB に接続するとします。
Dockerfile
#
ポート 8088 でサーバを立ち上げます。
Docker コンテナ立ち上げ時に diesel をインストールします。
1# 開発環境
2FROM rust:1.57.0 as develop-stage
3WORKDIR /app
4RUN cargo install cargo-watch
5RUN apt install -y libpq-dev
6RUN cargo install diesel_cli
7
8# ビルド環境
9FROM develop-stage as build-stage
10RUN cargo build --release
docker-composed.yml
#
diesel 起動時に環境変数 DATABASE_URL
が必要なので指定します。
1version: '3.7'
2
3services:
4 server:
5 build:
6 context: ./server
7 target: 'develop-stage'
8 ports:
9 - '8088:8088'
10 depends_on:
11 db:
12 condition: service_healthy
13 environment:
14 - DATABASE_URL=postgres://admin:password@db:5432/postgres
15 command: /bin/sh -c "diesel setup && cargo watch -x run
16 tty: true
17 db:
18 image: postgres:14-alpine
19 ports:
20 - '5432:5432'
21 environment:
22 POSTGRES_USER: admin
23 POSTGRES_PASSWORD: password
24 POSTGRES_DB: postgres
25 healthcheck:
26 test: ["CMD-SHELL", "pg_isready"]
27 interval: 10s
28 timeout: 5s
29 retries: 5
docker-compose.yml
の中身に関してのポイントは以下の3点です:
- DB のホスト名は DB コンテナのサービス名となる。
- 今回の場合は
db
- よって、
DATABASE_URL
に渡す URL は上記の通りとなる。
- 今回の場合は
- アプリサーバのコンテナは起動させっぱなしにする:
tty: true
を指定する。 - アプリサーバのコンテナは DB サーバのコンテナが正常起動し終わった後に起動させる。
server
のdepends_on
にサービスdb
を指定し、条件service_healthy
を指定する。db
のhealthcheck
に DB が正常に起動していることを確かめるためのコマンドを指定する。depends_on
のみの指定は単に起動順を制御するのみで、正常起動したかどうかを確かめた上で起動するわけではないことに注意。
上記のファイルを作成した上で、 docker-compose up -d
を実行すると、(初回はビルドが走った後に)無事にコンテナが起動します。
1$ docker-compose ps (git)-[main]
2 Name Command State Ports
3------------------------------------------------------------------------------------------------------------
4rust-web-api-server-sample_db_1 docker-entrypoint.sh postgres Up(healthy) 0.0.0.0:5432->5432/tcp
5rust-web-api-server-sample_server_1 bash Up 0.0.0.0:8088->8088/tcp
まとめ#
- docker-compose で DB とアプリサーバを管理する際に引っかかった点をまとめました。
- diesel を使用していると、 DB が正常起動していなければアプリが立ち上がらなかったため、少し苦労しました。