やりたいこと
 
- ローカル環境で、Docker Composeを使ってAPIやMySQLを立てている状態
 - 既存のプロダクトコードやCI/CDに影響がないようにER図を自動生成したい
 - 最終的に、GitHub PagesでER図をいつでも見れるようにしたい
 - Docker Composeを使ってローカル環境起動中に、コマンドを実行することでスキーマ情報を解析し、ER図を自動出力する
 
※今回はMySQLで解説するが、SchemaSpyを使うため、他のデータベースでも可
 
ディレクトリ構成
ディレクトリ構成は以下の通りだ。
- schemaspy
 - docker-compose-schemaspy.yml
 - docs
 
が今回新しく作るところである。
.
├── apps
│   ├── be # BEのAPIに関するディレクトリ
│   ├── db # MySQLに関するディレクトリ
│   └── schemaspy # 今回追加するもの
├── docker-compose-schemaspy.yml # 今回追加するもの
├── docker-compose.yml
├── docs # GitHub Pagesに公開するためのディレクトリ(ここに出力される)
└── sample.code-workspace  ER図生成に使うツール
ER図生成では、SchemaSpyというものを利用する。
SchemaSpy • Database Documentation Built Easy.schemaspy.org
普通に使う場合はJavaの環境構築が必要になる。
ただし専用のDockerイメージが提供されているため、これを使うことでローカル端末にJavaの環境を構築する手間を省くことができる。
既存のdocker-compose.yml
 このリポジトリは、BEとDBの構成になっており、 
 BEのAPIからDBにアクセスできるようにしてある。  
 ホットリロード設定やデータベースの永続化など細かいところを行っているが 
 今回ポイントになるところはDBの exposeを指定している箇所だ。  
 このexpose設定により、同じDocker Composeのネットワークに存在するコンテナから 
 このDBに対して3306ポートで通信を行うことができる。  
services:
  be:
    container_name: be
    build:
      context: ./apps/be
      dockerfile: Dockerfile
      target: development
    depends_on:
      - db
    # ホストマシンから直接アクセスできるように設定
    ports:
      - "3020:3020"
    # ホットリロードのための設定
    develop:
      watch:
        - action: sync
          path: ./apps/be/src # ホストマシンのディレクトリ
          target: /usr/workspace/src # コンテナのディレクトリ
          ignore:
            - node_modules/
        - action: rebuild
          path: ./apps/be/package.json
  db:
    container_name: db
    build:
      context: ./apps/db
      dockerfile: Dockerfile
      target: development
    expose:
      - 3306  # BEからアクセスするためにポートを開放
    # ホストマシンから直接アクセスできるように設定
    ports:
      - "3306:3306"
    # データベースの内容を永続化する
    volumes:
      - sample-db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=Password!
      - MYSQL_DATABASE=sample
      - MYSQL_USER=user
      - MYSQL_PASSWORD=Password!
volumes:
  sample-db:  SchemaSpyの設定ファイルを作成する
 apps/schemaspyディレクトリに、schemaspy.propertiesファイルを作成し、 
 以下の内容を記載する。  
ポイントは、ホスト名にdocker-compose.ymlで指定しているMySQLのサービス名を記載することだ。
# type of database. Run with -dbhelp for details
# if mssql doesn't work: try mssql08 in combination with sqljdbc_7.2, this combination has been tested
schemaspy.t=mysql
# MySQLの場合はドライバの明示指定不要
# schemaspy.dp=path/to/drivers
# docker-composeのサービス名を指定する
schemaspy.host=db
# MySQLがexposeで開放しているポート
schemaspy.port=3306
schemaspy.db=sample
schemaspy.u=user
schemaspy.p=Password!
# output dir to save generated files
schemaspy.o=/output
# db scheme for which generate diagrams
schemaspy.s=sample  データベースをMySQL以外にしたい場合や、詳細を知りたい場合は以下を参照すると良い。
 Get Started — SchemaSpy 6.0.0 documentation  
Dockerfile作成
 schemaspy.propertiesを読み込めるようにDockerfileを作成する。  
 apps/schemaspyディレクトリに配置する。  
FROM schemaspy/schemaspy:6.2.4
# 先ほど作成した設定ファイルをDockerコンテナに渡す
COPY ./schemaspy.properties /schemaspy.properties  docker-compose-schemaspy.yml作成
作成した
- apps/schemaspy/Dockerfile
 - apps/schemaspy/schemaspy.properties
 
を使って新しいcomposeファイルを作成する。
services:
  schemaspy:
    container_name: schemaspy
    build:
      context: ./apps/schemaspy
      dockerfile: Dockerfile
    platform: linux/amd64 # M1 Macで使うための設定
    # GitHub Pagesで公開することを想定し、docsディレクトリに出力する
    volumes:
      - ./docs:/output
    # docker-compose.ymlで作成したネットワークに接続する
    networks:
      - sample-repository_default
networks:
  sample-repository_default:
    external: true  ポイントは2つある。
- networksの設定
 - volumesの設定
 
①networksの設定
 通常、docker-compose.ymlとdocker-compose-schemaspy.ymlは別のcomposeなので 
 ここの間でのネットワーク通信は行うことができない。  
ただし、今回はDocker Compose同士のネットワーク通信ができるような設定を明示的に記載してある。
 docker-compose.ymlによって作成される独自ネットワークは、 
 デフォルトで「<プロジェクト名>_default」という名前で構成される。  
 SchemaSpyを立てるcomposeからは、そのネットワークに対してexternal: trueを指定することで疎通を可能にしている。  
これにより、SchamaSpyが別のDocker Composeに存在するMySQLに対して通信ができるようになる。
②volumesの設定
 SchemaSpyが出力したファイルをdocsディレクトリに格納したいので、 
 volumes設定を使ってローカルのdocsディレクトリとSchemaSpyコンテナの/outputディレクトリが同期されるように設定している。  
実行
ここまでできれば準備は完了している。
まずはプロダクトコードのDocker Composeを立ち上げる。
$ docker compose -p sample-repository up -d  次に、SchemaSpyのDocker Composeを立ち上げる。
$ docker compose -f ./docker-compose-schemaspy.yml up   実行が完了すると、ローカルのdocsディレクトリにファイルが出力されていることが確認できる。  
最後に掃除をしておく。
$ docker compose -f ./docker-compose-schemaspy.yml down -v --rmi all  GitHub Pagesの設定
 最後に、GitHubのリポジトリ設定画面から 
 ブランチ名の指定と/docsディレクトリをGitHub Pagesとして公開するような設定を行えばOK。  
 
「https://<アカウント名>.github.io/リポジトリ名/」でER図にアクセスできるようになる。
 ※Github Pagesとして公開されれる=インターネットに公開される、ということなので注意 
 (privateリポジトリでもURLを知っていたら閲覧できてしまう)