docker-composeを使ってマイクロサービスをやってる時に便利だったデバッグ手法

現在のプロジェクトで便利なデバッグ手法出てきたので備忘録として記載します。

今回例に挙げるフォルダ構成とdocker-composeファイルを下記に記載します。

フォルダ構成

workフォルダがrootでその下に、それぞれのマイクロサービスのdocker-compose.ymlがある感じ。
app開発するならappに移動してdocker-compose up。
analyze開発するならanalyzeに移動してdocker-compsoe up。

work
└ app
  ├ docker-compose.yml
└ migration
  ├ docker-compose.yml
└ analyze
  └ docker-compose.yml

docker-compsoeファイル

appマイクロサービス

appはバックとフロントどっちも入ってるRailsみたいなのを想像してください

appの開発に使用するdocker-compsoe.ymlを記載します

version: "3"
services:
  migration:
    image: xxx
    container_name: migration
    tty: true
  app:
    build: xxx
    volumes: xxx
    container_name: app
  analyze:
    image: mock_xxx(openAPIから作ったmock)
    container_name: analyze

migrationマイクロサービス

migrationはRailsのmigration機能を引っこ抜いて単体で動かせるようにしたのを想像してください
migrationの開発に使用するdocker-compsoe.ymlを記載します

version: "3"
services:
  migration:
    volumes: xxx
    container_name: migration
    tty: true

analyzeマイクロサービス

analyzeはappマイクロサービス から叩かれる分析用のAPIサーバーを想像してください
analyzeの開発に使用するdocker-compsoe.ymlを記載します

version: "3"
services:
  migration:
    image: xxx
    container_name: migration
    tty: true
  analyze:
    build: xxx
    volumes: xxx
    container_name: analyze

問題点

例で挙げたようなdocker-composeファイルを利用したマイクロサービスの開発は連携部分をチェックする事が多くなるかと思います。

連携部分をチェックする時に、都度ビルドしてイメージで固めてタグ付けてdocker-composeファイル修正するのが非常に面倒です。

具体的には下記のような要望を満たしたいのです。

  • 新規のmigration回しながらappで確認したい

  • analyzeで修正した内容をイメージで固める前にappで確認したい

  • analyzeをmockでなくて実体で起動してapp側で確認したい

そこで以下で紹介するデバッグ手法を開発に取り入れました。

デバッグ手法

イメージではなく実体でデバッグしていけるようにdocker-compose.debug.ymlファイルを作成します。

docker-compsoe.debug.ymlファイル

appマイクロサービス

migrationとanalyzeを実体で起動できるようにします。 パス指定を環境変数にします。

version: "3"
services:
  migration: 
    build: ${PATH_TO_MIGRATION}
    volumes:
      - ${PATH_TO_MIGRATION}:xxx
    container_name: migration
    tty: true
  app:
    build: xxx
    volumes: xxx
    container_name: app
  analyze:
    build: ${PATH_TO_ANALYZE}
    volumes:
      - ${PATH_TO_ANALYZE}:xxx
    container_name: analyze

他マイクロサービスを実体で起動する時は以下のコマンドを実行します

PATH_TO_MIGRATION=../migration PATH_TO_ANALYZE=../analyze docker-compose -f docker-compose.debug.yml up

これでanalyzeやmigrationをイメージで固めなくてもフォルダをいじっただけで即反映される環境が出来上がります

migrationマイクロサービス

連携部分がないのでdocker-compose.debug.ymlを作成する必要はありません。

analyzeマイクロサービス

migrationを実体で起動できるようにします。 そパス指定を環境変数にします。

version: "3"
services:
  migration: 
    build: ${PATH_TO_MIGRATION}
    volumes:
      - ${PATH_TO_MIGRATION}:xxx
    container_name: migration
    tty: true
  analyze:
    build: xxx
    volumes: xxx
    container_name: analyze

他マイクロサービスを実体で起動する時は以下のコマンドを実行します

PATH_TO_MIGRATION=../migration -f docker-compose.debug.yml up

この手法を取り入れてから実体で確認できるようになったので開発効率も向上し楽になりました。

1人の人間が複数マイクロサービス を担当していて確認作業を実施する回数が多い場合、効果を発揮するかと思います。