alpineベースのコンテナ + docker composeの環境で、いい感じに日本語フォントを追加する。
問題
alpineベースのコンテナで、あるGUIアプリを実行しましたが、日本語フォントが追加されておらず豆腐8丁に。
策
日本語フォント情報を作るための一時コンテナを作りIPA Fontをインストール。
Volume共有を利用して、メインのalipneコンテナで日本語を使えるようにします。
▼ docker-compose.yml
version: '3'
services:
fonts:
image: alpine
volumes:
- fonts:/usr/local/share/fonts
- fonts:/usr/share/fonts
- fonts:/var/cache/fontconfig
command: >
/bin/sh -c '
apk update &&
apk add --no-cache curl fontconfig &&
curl -O https://moji.or.jp/wp-content/ipafont/IPAexfont/IPAexfont00301.zip &&
mkdir -p /usr/share/fonts/ipa &&
unzip -o -d /usr/share/fonts/ipa/ IPAexfont00301.zip "*.ttf" &&
fc-cache -fv
'
main:
image: ubuntu
depends_on:
fonts:
condition: service_completed_successfully
volumes:
- fonts:/usr/local/share/fonts
- fonts:/usr/share/fonts
- fonts:/var/cache/fontconfig
volumes:
fonts:
このvolumesを共有すれば、別のalpineコンテナでもそのまま日本語対応できるはずです。
ミソ
共有するfontsフォルダ
/etc/fonts/fonts.conf
に記載のあるフォルダはすべて共有しました。
上記がalpineのフォント設定全文、ほかのLinux OSを使う場合は違ったパスになると思います。
depends_on condition
depends_on: fonts
だけでは、fonts がサービス起動した直後にmainコンテナが動き出します。
デスクトップ / VNC / アプリ がfontsを読み込まない可能性があるので、起動成功を待つように。
depends_on:
fonts:
condition: service_completed_successfully
unzip の方式
-o オプションで強制しつつ、
-d でfontsフォルダを指定、
"*.ttf" を渡して ttf ファイルのみを配置してもらってます。
unzip -o -d /usr/share/fonts/ipa/ IPAexfont00301.zip "*.ttf" &&
補足
Dockerfileでも良い
ただ、Dockerfileは個人的にヘビーだと思っています。
なんというか、ポータビリティに乏しい。
コンテナイメージを意識したり、パスを意識したり。
Dockerfileを作ること自体があまり好きじゃないです。
docker-compose.ymlで完結するのであれば、それが良い。
ただし、docker compose up
で都度コマンドが実行されるので、冪等性を意識するか if 分岐したほうが美しい。
そのほかにやったこと
NotoSansCJKjp を入れてみましたが、ダメでした。
表示される豆腐の形が変わりましたが、日本語自体は表示できなかった。
参考にさせていただいたページ
後記
まれにキャッシュの更新でexit code 1 になって、起動自体が失敗することがある。
fc-cache -fv
関係していそうなのは
fonts-1 | /var/cache/fontconfig: invalid cache file: 4c599c202bc5c08e2d34565a40eac3b2-le64.cache-8
fonts-1 | /var/cache/fontconfig: invalid cache file: 3830d5c3ddfd5cd38a049b759396e72e-le64.cache-8
このあたりだが、表示されていてもsucceeded していることもある。
謎。
Discussion