前回はローカルで実行してみましたが、環境作るの手間なので、既存アプリのDockerに導入してみました。
SchemaSpyでER図とDB設計書を自動生成する

失敗した方法

既存のDockerfileにopenjdk11-jdkを追加

FROM ruby:3.0.0-alpine
RUN apk update && apk add --no-cache --update build-base tzdata bash yarn python2 imagemagick graphviz ttf-freefont mysql-dev mysql-client openjdk11-jdk

db/にschemaspy-6.1.0.jar等を設置して実行

% docker-compose run web java -jar db/schemaspy-6.1.0.jar -configFile db/schemaspy.properties
Creating rails-app-origin_web_run ... done
  ____       _                          ____
 / ___|  ___| |__   ___ _ __ ___   __ _/ ___| _ __  _   _
 \___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
  ___) | (__| | | |  __/ | | | | | (_| |___) | |_) | |_| |
 |____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
                                             |_|    |___/

                                              6.1.0

SchemaSpy generates an HTML representation of a database schema's relationships.
SchemaSpy comes with ABSOLUTELY NO WARRANTY.
SchemaSpy is free software and can be redistributed under the conditions of LGPL version 3 or later.
http://www.gnu.org/licenses/

INFO  - Starting Main v6.1.0 on 2b4738aa04ce with PID 1 (/workdir/db/schemaspy-6.1.0.jar started by root in /workdir)
INFO  - The following profiles are active: default
INFO  - Found configuration file: db/schemaspy.properties
INFO  - Started Main in 1.271 seconds (JVM running for 2.156)
INFO  - Loaded configuration from db/schemaspy.properties
INFO  - Starting schema analysis
INFO  - Connected to MySQL - 8.0.25
INFO  - Gathering schema details
Gathering schema details.........(0sec)
Connecting relationships.........(0sec)
Writing/graphing summary.INFO  - Gathered schema details in 0 seconds
INFO  - Writing/graphing summary
INFO  - Graphviz rendered set to ''
........(4sec)
Writing/diagramming detailsINFO  - Completed summary in 4 seconds
INFO  - Writing/diagramming details
..

ここで固まる。フォントがないのが原因かな?メモリも疑ったけど。。。。
Dockerfileのapk addにttf-freefontやfont-noto-cjkを記載してbuildし直して実行。

font-noto-cjkだけ → 行けたり、行けなかったり
ttf-freefontだけ → 行けない
両方 → 行けない

そもそも通常使わないjdkを入れるのが良くないか。
Dockerは色々入れずに、環境毎に必要な時だけ使うのがベストプラクティスだと思われる。

上手く行った方法

docker-compose.yml の最後に追加

  jdk:
    build: schemaspy/
    volumes:
      - ./schemaspy:/workdir/schemaspy
    depends_on:
      - db

schemaspy/Dockerfile を作成

# https://hub.docker.com/_/openjdk
FROM openjdk:18-jdk-slim
RUN apt-get update -qq && apt-get install -y graphviz

WORKDIR /workdir/schemaspy
ENV LANG="ja_JP.UTF-8"
% cd schemaspy
% wget https://github.com/schemaspy/schemaspy/releases/download/v6.1.0/schemaspy-6.1.0.jar

% mkdir jdbc
% cd jdbc

MySQLに接続する場合
% wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.20/mysql-connector-java-8.0.20.jar

PostgreSQLに接続する場合
% wget https://jdbc.postgresql.org/download/postgresql-42.2.23.jar

% cd ..
% vi schemaspy.properties

MySQLに接続する場合の例

schemaspy.t=mysql
schemaspy.dp=jdbc
#schemaspy.host=127.0.0.1
schemaspy.host=db
schemaspy.port=3306
schemaspy.s=rails_app_development
schemaspy.db=rails_app_development
schemaspy.u=root
schemaspy.p=xyz789
#schemaspy.o=schemaspy
schemaspy.o=analysis

PostgreSQLに接続する場合の例

schemaspy.t=pgsql
schemaspy.dp=jdbc
#schemaspy.host=127.0.0.1
schemaspy.host=db
schemaspy.port=5432
schemaspy.s=public
schemaspy.db=rails_app_development
schemaspy.u=postgres
schemaspy.p=xyz789
#schemaspy.o=schemaspy
schemaspy.o=analysis

schemaspy/.dockerignore を作成

analysis

dockerignore に追加

schemaspy

.gitignore に追加

/schemaspy/analysis/*
!/schemaspy/analysis/.keep
% mkdir analysis
% touch analysis/.keep

buildして実行

% cd ..

コンテナ作成&起動
% docker-compose up --build
<省略>
Starting rails-app-origin_db_1 ... done
Starting rails-app-origin_web_1 ... done
Creating rails-app-origin_jdk_1 ... done
<省略>
jdk_1  | Jul 25, 2021 10:04:45 AM java.util.prefs.FileSystemPreferences$1 run
jdk_1  | INFO: Created user preferences directory.
jdk_1  | |  Welcome to JShell -- Version 18-ea
jdk_1  | |  For an introduction type: /help intro
jdk_1  | 
jdk_1  | jshell> db_1   | 2021-07-25T10:04:47.069670Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.26) starting as process 1
rails-app-origin_jdk_1 exited with code 0
<省略>

jdk環境は継続して何もしないので、終了します。(これがDockerですね)

SchemaSpyをjdk環境で実行
% docker-compose run jdk java -jar schemaspy-6.1.0.jar
% open schemaspy/analysis/index.html 

問題なく作成できました。fontも入ってるみたいですね。


今回のコミット内容
https://dev.azure.com/nightonly/rails-app-origin/_git/rails-app-origin/commit/ebcc50cb1e024cfc66ddde52496033963007e714

序でに、Rails ERDの文字化け対応の為、ttf-freefontも追加してます。
あと、migrateにcommentと[foreign_key: true]も追加

SchemaSpyを既存アプリのDockerに導入する” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です