この記事では、データベースのER図を自動生成する手順を解説する。
やりたいこと
- ローカル環境で、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というものを利用する。
普通に使う場合は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以外にしたい場合や、詳細を知りたい場合は以下を参照すると良い。
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図にアクセスできるようになる。