👌

alpineベースのコンテナ + docker composeの環境で、いい感じに日本語フォントを追加する。

2023/05/23に公開

問題

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 を入れてみましたが、ダメでした。
表示される豆腐の形が変わりましたが、日本語自体は表示できなかった。

https://qiita.com/nju33/items/b80d92a4257edeb4b9a1

参考にさせていただいたページ

https://developer-tools.zendesk.com/hc/ja/articles/4410422759183-Dockerで日本語フォントを含んだPDFを出力する方法

https://qiita.com/nju33/items/b80d92a4257edeb4b9a1

後記

まれにキャッシュの更新で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