前回はローカルで実行してみましたが、環境作るの手間なので、既存アプリの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も入ってるみたいですね。
序でに、Rails ERDの文字化け対応の為、ttf-freefontも追加してます。
あと、migrateにcommentと[foreign_key: true]も追加
“SchemaSpyを既存アプリのDockerに導入する” に対して2件のコメントがあります。