Docker を目的の異なる環境(例えば開発環境と本番環境)で運用する場合、異なる振る舞いをすることが期待されます。この記事ではこの環境毎に異なる振る舞いをする Docker 定義の作り方を紹介します。
まずは Compose ファイル(大体 docker-compose.yml という名前で置かれます)です。開発環境では mailhog(メールサーバモック), dozzle(Docker コンテナ監視), swagger(APIドキュメントの色々) などの開発を楽にするコンテナを用いたいですが、本番環境でそのようなコンテナが立ち上がっているのは無駄です。また本番環境ではサービスを止めないために restart: always の様な少々問題が起きようが動き続ける設定を入れたくもありますが、開発環境では問題があることに気づくためにそのような設定は入れたくありません。複数の Compose ファイルに環境毎の差異を記述し、それらを併用することで環境毎に異なる Compose 定義を使えます。
ファイル間、プロジェクト間での Compose 設定の共有 — Docker-docs-ja 17.06 ドキュメント#複数の Compose ファイルの利用
例えば、次の様に二つの Compose ファイルを用意し、
# docker-compose.yml version: "3" services: app: # プログラム実行コンテナ # 以降、開発環境と本番環境で共通の定義
# docker-compose.dev.yml version: "3" services: # メールモックサーバ mailhog: image: mailhog/mailhog ports: - 8025:8025 - 1025:1025
次の様にコマンドを叩くことで開発環境では mailhog が動き、本番環境では mailhog が動かない様にできます。
# 開発環境 docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d # 本番環境 docker-compose -f docker-compose.yml up -d
コマンドの間違いを防ぐために何かしらスクリプトを作るとなおよいです。
複数の Compose ファイルを用いることによって異なるコンテナ定義を使えることを示しました。この異なるコンテナ定義の中で呼び出す Dockerfile を変えることによって環境によって異なるイメージ定義を使えます。
Compose ファイル・リファレンス — Docker-docs-ja 17.06 ドキュメント Compose ファイル・リファレンス#dockerfile
Compose ファイルではコンテナに用いる Dockerfile の名前を指定できます。これを利用して次の様に環境毎に異なるイメージを同名コンテナで扱えます。
# docker-compose.dev.yml version: "3" services: app: build: context: ./docker/php # opcache の持続時間が短かったり、レイヤー数が多い代わりに変更しやすかったりする定義 dockerfile: Dockerfile.development
# docker-compose.prod.yml version: "3" services: app: build: context: ./docker/php # opcache の持続時間が長かったり、レイヤー数が少なくストレージをあまり食べなかったりする定義 dockerfile: Dockerfile.production