この記事はVR法人HIKKYのアドベントカレンダー3日目の記事です。
はじめに
世間では開発環境で Docker Composeを使いたい場合、
Dev Container を採用する場合が増えてきましたが、
VSCode の快適さを Jetbrains の IDE 等の環境で再現するのは難しく1、
自前で Docker Compose 組んだほうが快適だったりします。
とはいえ、面倒なのは嫌なので、できるだけ楽をする Docker Compose 環境の構築についての勘所を紹介します。
本記事では、シンプルなRailsアプリケーションを想定して構成します。
基本を押さえれば、構成が複雑になっても、同じ考え方で展開できます。
Docker Compose
docker-compose.yml の構成で工夫するところは以下の2点です。
- profiles の暗黙的呼び出しを使って楽をする
- 参照を使って楽をする
profiles の暗黙的呼び出しを使って楽をする
Docker Compose の profiles、使ってますか?
特徴を端的に書くと以下の挙動をします。
- profiles 無指定:
docker compose upで自動的に起動するコンテナ - profiles 指定:
docker compose --profile <PROFILE名> upで起動するコンテナ - profile が付いたサービス名を指定して走らせた時、profile はそのサービスのものになる
- profiles 無指定 のサービスは profile 付きのサービスから
depends_onで接続できる
用途ごとにprofileを定義しておけば、1つの docker-compose.yml にそれぞれの起動設定を書くことができ、それらが同時起動して競合しないようになっています。
参照を使って楽をする
YAMLの参照の構文を使い、記入量をできるだけ減らして楽をします。
-
&keyword: アンカー (参照元の定義) -
<<: *keyword: エイリアス (参照)
docker-compose.yml の例
x-vars:
environment: &environment
RAILS_ENV: development
# 〜略〜 各種環境変数
services:
app: &app
container_name: app
build:
context: .
dockerfile: ./.docker/rails/Dockerfile
# 〜略〜 ネットワークやボリュームの設定など
environment:
<<: *environment
depends_on:
- db
db:
# 〜略〜 一般的なDBの構成
console:
<<: *app
container_name: console
command: bash -c "bundle exec rails c"
stdin_open: true
tty: true
profiles:
- console
depends_on:
- db
test:
<<: *app
container_name: test
environment:
<<: *environment
RAILS_ENV: test
MYSQL_DATABASE: test
profiles:
- test
depends_on:
- db
このように書くと、例えばテストしたい場合、以下のコマンドで実行できます。
docker compose run --rm test
シェルスクリプトを使って後片付けを自動化する
docker compose コマンドを毎回打ってもいいですが、スクリプトを丁寧に書いて省力化してしまいましょう。
- ビルド忘れ防止
- コンテナを終了した後、関連サービスを自動Down
そんなひととおりワンストップでやってくれるシェル書いてしまいましょう。
docker compose --profile console build
docker compose run --rm console
EXIT_CODE=$?
docker compose --profile console rm -fsv db
exit $EXIT_CODE
$? の部分で終了コードを受け取って、コンテナ終了後に、関連のサービスを終わらせています。
さいごに
こんな構成で Docker Compose を構築すると、環境ごとにファイル分けたりしなくても、使いやすい環境を構築できるのではないでしょうか2。