環境
- Docker
- Alpine Linux 3
やりたいこと
Dockerで軽量イメージを作る上で欠かせないAlpine Linuxで日本語フォントを使う場合、実は
RUN apk add font-ipa fontconfig && fc-cache -f
を実行するだけで日本語は表示できる。が、今回は明朝体もきれいに表示させたい。
そのままだと以下のようにすべてゴシック体で表示されてしまう。
ちなみに今回はdockerの中ということもありrootでしか扱わない前提で話す。
まずはインストール
今回は表示の綺麗さに定評のあるGoogle Noto Fontsを使う。ゴシップ体だけ使うのであればすでにパッケージが出ているので apk add font-noto-cjk
で入るが、今回は明朝体もほしいので手動で入れる。最後 fc-cache
を実行するのを忘れずに.
RUN wget -q https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \ && unzip NotoSansCJKjp-hinted.zip \ && wget -q https://noto-website-2.storage.googleapis.com/pkgs/NotoSerifCJKjp-hinted.zip \ && unzip -o NotoSerifCJKjp-hinted.zip \ && mv *.otf /usr/share/fonts/TTF \ && rm *.zip \ && fc-cache -f
が、これだけでは明朝体は表示されない。。。
原因
以下のようにCSSで名指しでNoto Fontを書かれている場合はきちんと明朝体で表示できるので、インストール自体はちゃんと出来てるっぽい。
body { font-family: 'Noto Serif JP', sans-serif; }
fc-match
コマンドを使うと指定したフォントの時、どのフォントが使われるのか調べられるので試してみる。
# fc-match sans-serif OpenSans-Regular.ttf: "Open Sans" "Regular"
あれ、Noto Fontくんは??????
どうもアルファベットだけのOpenSansというフォントが優先されてしまって結果的にserif系日本語フォントがないことになってしまいゴシップフォントが表示されてしまってるっぽい。
つまりOpenSansを抹消すればよい(乱暴
rm /usr/share/fonts/TTF/OpenSans*
が、結果は変わらず。。。
# fc-match sans-serif OpenSans-Regular.ttf: "Open Sans" "Regular"
fontconfigでデフォルトフォントを変更する
結局のところCSSで「serif」を指定しても「Noto Serif CJK JP」が使われないのが悪い。
ってことで明示的に設定してあげる必要がある。
/root/.config/fontconfig に以下を作成し、
<?xml version='1.0'?> <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'> <fontconfig> <!-- Default serif fonts --> <match target="pattern"> <test qual="any" name="family"><string>serif</string></test> <edit name="family" mode="prepend" binding="same"><string>Noto Serif CJK JP</string></edit> </match> </fontconfig>
確認
# fc-match serif NotoSerifCJKjp-Regular.otf: "Noto Serif CJK JP" "Regular"
キタ━━━━(゚∀゚)━━━━!!
サイトでも確認してみる。ちゃんと明朝体表示になっている。
キタ━━━━(゚∀゚)━━━━!!
まとめ
今までをまとめると以下のコマンドになる。
RUN wget -q https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \ && unzip NotoSansCJKjp-hinted.zip \ && wget -q https://noto-website-2.storage.googleapis.com/pkgs/NotoSerifCJKjp-hinted.zip \ && unzip -o NotoSerifCJKjp-hinted.zip \ && mv *.otf /usr/share/fonts/TTF \ && rm /usr/share/fonts/TTF/OpenSans* \ && rm *.zip \ && mkdir -p /root/.config/fontconfig ADD docker/fonts.conf /root/.config/fontconfig/fonts.conf RUN fc-cache -f
- フォントをインストール
- 既存のserifフォントを削除
- fc-cacheを実行
できればserifフォントもapkでインストールできるようになればなぁ。。