docker compose 上で SchemaSpy が動かないのを直す (MySQL 8, Apple M1 Mac)


## はじめに

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." を選ぶ。

```yaml
  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 などが出力されます。


## 失敗１：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


## 失敗２：いろいろ必要になる

### ドライバ

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


## 失敗３：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 を動かした。
思ったよりサクッと動かない。代替を考えたほうがよいのだろうか。