カテゴリー
Linux

docker-compose.yml に Schemaspy を利用するシンプルな service を書いて、データベースドキュメントを自動生成する

ポイント

  • property ファイルではなく command をわざと利用した。 command のオプションに .env のデータベース接続情報を渡したかったため。 property ファイルの場合、 .env の情報を property ファイルにも記述しなければならなくなる。
  • MySQL 8 の場合、データベースに接続するために SSL を false にしてやる必要があった。この時、エスケープの関係で cli では -connprops useSSL\\=false 、 (こちらはうろ覚えだが) property ファイルでは schemaspy.connprops=useSSL\=false と書く必要があり (試していないが schemaspy.connprops="useSSL\=false"schemaspy.connprops="useSSL=false" でもいいのかも) 、ややこしかった。
  • MySQL 8 の場合、データベースに接続するために別途ドライバーをダウンロードして用意してやる必要があった。
  • 作ったもの => oki2a24/sample_docker_schemaspy: Docker Schemaspy コンテナの使用例です。

データベースからドキュメントを生成する docker-compose.yml

version: "3.7"
services:
  db:
    image: mysql:8.0.19
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

  schemaspy:
    image: schemaspy/schemaspy:6.1.0
    volumes:
      - ./schemaspy/drivers:/drivers
      - ./schemaspy/output:/output
    command: >
      java -jar schemaspy.jar
      -t mysql
      -dp /drivers
      -host db
      -port 3306
      -db ${DB_DATABASE}
      -u ${DB_USER}
      -p ${DB_PASSWORD}
      -s ${DB_DATABASE}
      -connprops useSSL\\=false

.env の中身

DB_DATABASE=exampledb
DB_USER=exampleuser
DB_PASSWORD=examplepass
DB_ROOT_PASSWORD=root

最終的なディレクトリ構造

$ tree
.
├── .env
├── docker-compose.yml
├── mysql
│   └── docker-entrypoint-initdb.d
│       └── wordpress.sql
└── schemaspy
    ├── drivers
    │   └── mysql-connector-java-8.0.19.jar
    └── output
        ├── anomalies.html
        ... 以下、自動生成されたファイル。省略 ...
54 directories, 212 files
$

実行

docker-compose up schemaspy

以下、補足情報で、トライアルアンドエラーです。

補足。エラー

schemaspy_1  | Fri Jan 31 23:58:47 GMT 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
schemaspy_1  | WARN  - Connection Failure
schemaspy_1  | Failed to connect to database URL [jdbc:mysql://db:3306/exampledb] Unable to load authentication plugin 'caching_sha2_password'.

補足。またしてもエラー

schemaspy_1  | WARN  - Connection Failure
schemaspy_1  | Failed to connect to database URL [jdbc:mysql://db:3306/exampledb] Unable to load authentication plugin 'caching_sha2_password'.

先ほども出力されている内容ではあったが、こちらのエラーが残っているように考えられました。

見直すとログ出力には次の記述がありました。

schemaspy_1  | mysql-connector-java-6.0.6.jar, postgresql-42.1.1.jre7.jar

この mysql-connector-java-6.0.6.jar のバージョンが古いようです。

から "Platform Independent" を選択して Platform Independent (Architecture Independent), ZIP Archive の Download をクリックし、 "No thanks, just start my download." をクリックしてダウンロードしました。 mysql-connector-java-8.0.19.jar が入っておりました。

補足。うまくいった

出力されたログを見ますと、 mysql-connector-java-8.0.19.jar を使っていることがわかります。 そして、 "sample_docker_schemaspy_schemaspy_1 exited with code 0" と 0 で終わっているので、正常終了したことがわかります。

$ docker-compose rm --force schemaspy ; docker-compose up schemaspy
Going to remove sample_docker_schemaspy_schemaspy_1
Removing sample_docker_schemaspy_schemaspy_1 ... done
Creating sample_docker_schemaspy_schemaspy_1 ... done
Attaching to sample_docker_schemaspy_schemaspy_1
schemaspy_1  | Running Main-Class org.springframework.boot.loader.JarLauncher
schemaspy_1  | With drivers:mysql-connector-java-8.0.19.jar
schemaspy_1  |   ____       _                          ____
schemaspy_1  |  / ___|  ___| |__   ___ _ __ ___   __ _/ ___| _ __  _   _
schemaspy_1  |  \___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
schemaspy_1  |   ___) | (__| | | |  __/ | | | | | (_| |___) | |_) | |_| |
schemaspy_1  |  |____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
schemaspy_1  |                                              |_|    |___/
schemaspy_1  |
schemaspy_1  |                                               6.1.0
schemaspy_1  |
schemaspy_1  | SchemaSpy generates an HTML representation of a database schema's relationships.
schemaspy_1  | SchemaSpy comes with ABSOLUTELY NO WARRANTY.
schemaspy_1  | SchemaSpy is free software and can be redistributed under the conditions of LGPL version 3 or later.
schemaspy_1  | http://www.gnu.org/licenses/
schemaspy_1  |
schemaspy_1  | INFO  - Starting Main v6.1.0 on 690cf4e9e450 with PID 1 (/schemaspy-6.1.0.jar started by java in /)
schemaspy_1  | INFO  - The following profiles are active: default
schemaspy_1  | INFO  - Started Main in 1.754 seconds (JVM running for 2.483)
schemaspy_1  | INFO  - Starting schema analysis
schemaspy_1  | INFO  - Connected to MySQL - 8.0.19
schemaspy_1  | INFO  - Gathering schema details
schemaspy_1  | Gathering schema details...............(0sec)
schemaspy_1  | Connecting relationships...............(0sec)
schemaspy_1  | Writing/graphing summary.INFO  - Gathered schema details in 0 seconds
schemaspy_1  | INFO  - Writing/graphing summary
schemaspy_1  | INFO  - Graphviz rendered set to ''
schemaspy_1  | ........(2sec)
schemaspy_1  | Writing/diagramming detailsINFO  - Completed summary in 2 seconds
schemaspy_1  | INFO  - Writing/diagramming details
schemaspy_1  | ............(0sec)
schemaspy_1  | Wrote relationship details of 12 tables/views to directory '/output' in 3 seconds.
schemaspy_1  | View the results by opening /output/index.html
schemaspy_1  | INFO  - Wrote table details in 0 seconds
schemaspy_1  | INFO  - Wrote relationship details of 12 tables/views to directory '/output' in 3 seconds.
schemaspy_1  | INFO  - View the results by opening /output/index.html
sample_docker_schemaspy_schemaspy_1 exited with code 0
$

参考情報

おわりに

今回、データベースとして WordPress インストール直後のものを使用しました。生成されたデータベースドキュメントのウェブページを見ると、本投稿の画像のようにリレーションがありませんでした。

これは、外部キーが元々使われていないためでしょう。

メタ情報の XML ファイルを作成し、そこにリレーション情報を記述してやれば、 データベース関連図 データベース構造 – WordPress Codex 日本語版 のようなリレーションが把握できるようなドキュメントが生成されるはずです。

この点が不満でしたけれども、それを除けば自動でここまで見やすいドキュメントを生成できますので、普段使いにできそうに思います。

以上です。

コメントを残す