Alpine Linuxでrails-erd実行時の文字化け対応

# はじめに
個人開発のサービスにて、Alpine Linux上で[rails-erd](https://voormedia.github.io/rails-erd/)を使ったところ、生成されたPDFが文字化けしてしまいました。
この解決に時間がかかってしまったので、備忘録もかねて現象と解決方法を載せておきます。

# 環境
macOS Catalina Version 10.15.5
Ruby on Rails : 5.2.3
Ruby on Railsのコンテナベースイメージ：ruby:2.6.5-alpine3.9

# 課題
個人開発にて開発中、新しくテーブルの追加が必要になりました。その際、既存のテーブルや各テーブルの関係が大事なので、現状どうなっているのかを調べ始めました。幸いにも、少ないテーブルのみで構成されていたのでコードだけで把握することができました。
ただ、今後テーブルが増えていった時を考えると、ER図を用意し、それだけを見れば構成が分かるようにしておくと、把握する時間が短縮できると考えました。

さっそくER図を作る方法を考えましたが、テーブル構成をコードから書き起こしていっては本末転倒です。なるべく手間を掛けずにER図を自動生成してくれるツールを探したところ、rails-erdというgemを見つけました。このrails-erdはActiveRecordのモデルからER図を自動生成してPDFに出力してくれるツールです。

これだ！と思ってgemを入れて、コンテナ上でER図を生成するよう```bundle exec erd```を実行したのですが、出来上がったPDFは全部文字化け(すべて白色の四角文字)となっていました。
なお、ローカルで同じコマンドを実行したところ、文字化けされていないPDFが生成されました。
ただ私としては、ローカルを極力汚さずコンテナ上ですべて行いたかったので、この解決策を探りました。

# 対応
まず、文字化けする場合は出力する文字コードがおかしいのではないかと考えました。そのためrails-erdで出力する文字コードには何を使っているのか調べました。
rails-erdの[インストール手順](https://voormedia.github.io/rails-erd/install.html)を見たところ、出力用のツールとして[Graphviz](https://graphviz.org/)を使用しているようです。
> Rails ERD generates diagrams using Graphviz, a visualisation library.

このGraphvizで扱っている文字コードはUTF-8、iso-8859-1の2つであり、デフォルトはUTF-8となっています。
> 現在、Graphvizがサポートするエンコーディングは、
> - UTF-8
> - iso-8859-1 (Latin1)　
>
>の2つです。

[Graphvizで日本語を使う (Graphviz version 2.26.3)](https://simply-k.hatenadiary.org/entry/20100705/1278326617)

> Specifies the character encoding used when interpreting string input as a text label. The default value is "UTF-8". The other legal value is "iso-8859-1" or, equivalently, "Latin1".

[Node, Edge and Graph Attributes](http://www.graphviz.org/doc/info/attrs.html#d:charset)

UTF-8がデフォルトのため、Graphvizが使う文字コードがおかしい線は消えました。

では次に、そもそものベースイメージの文字コードに問題があるのではと考えました。
rails-erdを使っているコンテナのベースイメージにはAlpine Linuxを使っています。
alpineについて調べたところ、alpineには文字コードがセットされていないようでした。
[How I use locales in Alpine](https://github.com/gliderlabs/docker-alpine/issues/144)
試しにalpineを起動してlocaleにen_US.UTF-8をセットし、rails-erdを実行してみましたが、現象は変わりませんでした。

ここまでやってみた結果をTwitterでつぶやいたところ、[maitubame](https://twitter.com/maitubame)さんから記事を紹介して頂きました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/zY8KY469I6">https://t.co/zY8KY469I6</a><br><br>この方の記事、未読なら参考になりそうです</p>&mdash; maitubame (@maitubame) <a href="https://twitter.com/maitubame/status/1300435590412787712?ref_src=twsrc%5Etfw">August 31, 2020</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


この記事には、私が抱えている課題と解決策がそのまま書いてありました。せっかくなのでこの記事に書かれているフォントや実行コマンドが何なのか軽く調べてみました。

- フォント
  - [msttcorefonts-installer](https://pkgs.alpinelinux.org/package/edge/community/x86/msttcorefonts-installer): Web用のMicrosoftコアフォントが入っているパッケージ
  - [fontconfig](https://pkgs.alpinelinux.org/package/edge/main/x86/fontconfig): フォントに関する情報を提供するライブラリ([Wikipedia](https://ja.wikipedia.org/wiki/Fontconfig)参照)
  - [font-bitstream-type1](https://pkgs.alpinelinux.org/package/edge/main/x86/font-bitstream-type1): X Windows Systemのオープンソースを提供しているX.orgプロジェクトのフォント
  - [ghostscript-fonts](https://pkgs.alpinelinux.org/package/edge/main/x86/ghostscript-fonts): Ghostscriptで配布されているフォント

  - [ttf-freefont](https://pkgs.alpinelinux.org/package/v3.3/main/x86/ttf-freefont)
  TrueTypeフォント

- 実行コマンド
  ```update-ms-fonts```、```fc-cache -f ```を行うことでフォントの更新が完了するようです。
  [How to install Microsoft true type font on Alpine Linux?
](https://unix.stackexchange.com/questions/438257/how-to-install-microsoft-true-type-font-on-alpine-linux)

上記のフォントや実行コマンドを入れたコンテナを作り、```bundle exec rails-erd```を行ったところ、文字化けせずに正常に出力されました。

# まとめ
コマンド1つでER図を出せるのは嬉しいですね。また、CIのパイプラインに載せて、テーブル更新ごとにドキュメントを出力できるようにしておくのも良さそうです。
ただ、rails-erdの開発があまり活発ではなく、2019年のリリースが最後なので、今後別のライブラリにて出力できるようになるかもしれませんね。