はじめに
docker compose だけでサクッと SchemaSpy を使うと、いろいろ動かないので、解決策を書く。
次を前提にする。
- docker-compose.yaml にサービスを定義
- SchemaSpy 6.1.0
- MySQL 8
- Apple M1 Mac (arm64)
解決策
後述の docker-compose.yaml で動いた。
Docker イメージに JDK を使います。Amazon Corretto を使ってますが、ほかの JDK でも動きます。バージョンは 14 以下である必要があります。
schemaspy-[version].jar は公式 http://schemaspy.org などからダウンロードして ./schemaspy/ に置きます。
ドライバを次からダウンロードして、./schemaspy/drivers/ に置きます。
https://dev.mysql.com/downloads/connector/j/
Select Operating System: "Platform Independent" を選び、"ZIP Archive" を選び、"No thanks, just start my download." を選ぶ。
schemaspy:
image: amazoncorretto:8
volumes:
- ./schemaspy:/app
command: >
java -jar /app/schemaspy-6.1.0.jar
-db hoge_db
-t mysql
-host hoge_host -port 3306 -s hoge_schema -u hoge_user -p hoge_password
-dp /app/drivers/
-o /app/outputs/
-vizjs
実行が終わると ./schemaspy/outputs に HTML などが出力されます。
失敗1:Docker イメージ schemaspy/schemaspy が終わらない
help でも終わらない。トラブルシューティングしづらい。
$ docker run schemaspy/schemaspy:6.1.0 --help
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
Running Main-Class org.springframework.boot.loader.JarLauncher
With drivers:jtds-1.3.1.jar, mariadb-java-client-1.1.10.jar
mysql-connector-java-6.0.6.jar, postgresql-42.1.1.jre7.jar
SchemaSpy は jar ファイルで動くので JDK 上で動かして、次に進めた。
SchemaSpy is just a single executable jar-file (schemaspy-[version].jar)
https://schemaspy.readthedocs.io/en/latest/installation.html#schemaspy
失敗2:いろいろ必要になる
ドライバ
jar ファイルのほかにドライバが必要、デフォルトで探すドライバが古いので、新しいドライバを置いて、SchemaSpy のオプション -dp
で置いた場所を読ませる。
Failed to connect to database URL [jdbc:mysql://hoge_host:3306/hoge_schema] Failed to create any of 'com.mysql.cj.jdbc.Driver, com.mysql.jdbc.Driver' driver from driverPath '/mysql/mysql-connector-java-5.1.6-bin.jar' with sibling jars no.
Resulting in classpath: empty
There were missing paths in driverPath:
/mysql/mysql-connector-java-5.1.6-bin.jar
Use commandline option '-dp' to specify driver location.
If you need to load sibling jars used '-loadjars'
INFO - StackTraces have been omitted, use `-debug` when executing SchemaSpy to see them
ERROR: 3
Graphviz
jar ファイルのほかに Graphviz が必要。
WARN - Failed to query Graphviz version using 'dot -V'
Cannot run program "dot": error=2, No such file or directory
INFO - Graphviz rendered set to ''
..ERROR - RelationShipDiagramError
Failed to produce diagram for: /app/outputs/diagrams/summary/relationships.implied.compact.dot
(中略)
Exception in thread "main" java.lang.reflect.InvocationTargetException
(中略)
Caused by: org.schemaspy.output.diagram.DiagramException: Failed to generate Table diagram
(中略)
Caused by: org.schemaspy.output.diagram.DiagramException: Dot missing or invalid version
(中略)
ERROR: 1
幸い SchemaSpy 6.1.0 から内蔵されたので、オプション -vizjs
を指定する
Since version 6.1.0 Graphviz is no longer required. There is an embedded viz.js that can be used by adding command line argument
vizjs
https://schemaspy.readthedocs.io/en/latest/installation.html#optional
失敗3:JDK が新しいと出力に失敗する
Exception in thread "main" java.lang.reflect.InvocationTargetException
(中略)
Caused by: java.lang.IllegalArgumentException: viz.js
(中略)
Caused by: java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.eval(String)" because "this.scriptEngine" is null
(中略)
ERROR: 1
Nashorn (javascript engine) was removed in Java 15, see https://openjdk.java.net/jeps/372
https://github.com/schemaspy/schemaspy/issues/753
公式はバージョン 8 を明示しているので、8 を使う。
https://schemaspy.readthedocs.io/en/latest/installation.html#java-8
おわりに
docker compose だけで SchemaSpy を動かした。
思ったよりサクッと動かない。代替を考えたほうがよいのだろうか。