かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot 2.2.x の Web アプリを 2.3.x へバージョンアップする ( その17 )( app コンテナを実行する Alpine Linux で ja_JP.utf8 のロケールを使えるようにする )

概要

記事一覧はこちらです。

Spring Boot 2.2.x の Web アプリを 2.3.x へバージョンアップする ( その16 )( ValuesHelper クラスで guava の ClassPath を使用しないよう変更する ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Alpine Linux ベースの app コンテナで Web アプリを実行すると日本語のメッセージが表示されないことに気づいたので、その問題を解消します。

参照したサイト・書籍

  1. Dockerコンテナ上でJavaプログラムを動かすときにLANG環境変数を設定すると日本語のファイル名が文字化けする問題
    https://qiita.com/Targityen/items/f921c95e684810d7087f

  2. alpineベースのDockerイメージだとlocaledefが動かない
    https://hacknote.jp/archives/26886/

  3. teikoku-penguin / alpine-ja_JP/ Dockerfile
    https://github.com/teikoku-penguin/alpine-ja_JP/blob/master/Dockerfile

  4. sgerrand / alpine-pkg-glibc
    https://github.com/sgerrand/alpine-pkg-glibc

  5. AdoptOpenJDK / openjdk-docker
    https://github.com/AdoptOpenJDK/openjdk-docker

  6. How to set locale in Docker Alpine?
    https://stackoverflow.com/questions/49042223/how-to-set-locale-in-docker-alpine

  7. ロケール環境変数」の種類と優先順位まとめ【LC_ALL・LC_*・LANG・LANGUAGE】
    https://linuxfan.info/locale-variables

目次

  1. Docker で Web アプリを実行すると日本語のメッセージが表示されない
  2. app コンテナの Alpine Linux に sgerrand/alpine-pkg-glibc をインストールして ja_JP.utf8 を使用可能にする

手順

Docker で Web アプリを実行すると日本語のメッセージが表示されない

動作確認をしていて気づいたのですが、IntelliJ IDEA から Web アプリを実行した時にはログイン画面から何も入力せずに「ログイン」ボタンを押すと日本語のメッセージが表示されますが、

f:id:ksby:20201228163523p:plain

Docker 上で adoptopenjdk/openjdk11:jdk-11.0.9.1_1-alpine-slim ベースのコンテナから Web アプリを実行した時には日本語のメッセージが表示されません。

f:id:ksby:20201228163929p:plain

Dockerコンテナ上でJavaプログラムを動かすときにLANG環境変数を設定すると日本語のファイル名が文字化けする問題 の記事によると日本語ロケールが登録されていないためらしいのですが、docker/app/docker-entrypoint.sh に locale -a を追加して実行しても、

#!/bin/sh
# 改行コードを LF にすること。LF でないと実行されない。

export JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=384m"

locale -a
exec java $JAVA_OPTS \
          -Djava.security.egd=file:/dev/./urandom \
          -Dspring.profiles.active=product \
          -Dserver.tomcat.basedir=/ \
          -Dlogging.appender=CONSOLE \
          -jar /app.jar

locale: not found のメッセージが表示されて、指定可能なロケールを確認することが出来ませんでした。

f:id:ksby:20201228164455p:plain

app コンテナの Alpine Linux に sgerrand/alpine-pkg-glibc をインストールして ja_JP.utf8 を使用可能にする

alpineベースのDockerイメージだとlocaledefが動かない の記事によると glibc 関連らしく、もう少し調べていたら teikoku-penguin/alpine-ja_JP/Dockerfile を見つけました。

docker/app/Dockerfile を以下のように変更します。

FROM adoptopenjdk/openjdk11:jdk-11.0.9.1_1-alpine-slim

RUN apk update && \
    apk upgrade; \
    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub; \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.31-r0/glibc-2.31-r0.apk; \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.31-r0/glibc-bin-2.31-r0.apk; \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.31-r0/glibc-i18n-2.31-r0.apk; \
    apk add --no-cache --update \
    bash \
    tzdata \
    glibc-2.31-r0.apk \
    glibc-bin-2.31-r0.apk \
    glibc-i18n-2.31-r0.apk; \
    rm glibc-2.31-r0.apk glibc-bin-2.31-r0.apk glibc-i18n-2.31-r0.apk

RUN /usr/glibc-compat/bin/localedef -i ja_JP -f UTF-8 ja_JP.UTF-8

ENV TZ Asia/Tokyo
ENV LANG ja_JP.utf8
ENV LC_ALL ja_JP.utf8

VOLUME /tmp
EXPOSE 8080
ENTRYPOINT ["docker-entrypoint.sh"]
  • RUN apk add --no-cache tzdataRUN apk update && ... rm glibc-2.31-r0.apk glibc-bin-2.31-r0.apk glibc-i18n-2.31-r0.apk に変更します。openjdk-docker/11/jdk/alpine/Dockerfile.hotspot.releases.slim を見ると glibc のバージョンが 2.31-r0 でしたので apk update ... のコマンド内で指定する glibc のバージョンを 2.31-r0 に変更します。
  • この方法でインストールした後 locale -a コマンドを実行して表示されたロケールja_JP.utf8 でしたので、ENV LANG="ja_JP.UTF-8"ENV LANG ja_JP.utf8 に変更します。
  • 環境変数 LANG を指定しただけでは日本語メッセージが表示されない問題が解消されないため ENV LC_ALL ja_JP.utf8 を追加します。

docker/app/docker-entrypoint.sh にロケール一覧を確認するために /usr/glibc-compat/bin/locale -a を追加します。

#!/bin/sh
# 改行コードを LF にすること。LF でないと実行されない。

export JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=384m"

/usr/glibc-compat/bin/locale -a
exec java $JAVA_OPTS \
          -Djava.security.egd=file:/dev/./urandom \
          -Dspring.profiles.active=product \
          -Dserver.tomcat.basedir=/ \
          -Dlogging.appender=CONSOLE \
          -jar /app.jar

docker-compose -f docker-compose.app.yml --compatibility build --no-cache コマンドを実行して Docker Image を作り直します。

f:id:ksby:20201228171500p:plain f:id:ksby:20201228171641p:plain f:id:ksby:20201228171738p:plain

docker-compose -f docker-compose.app.yml --compatibility up -d コマンドで app コンテナを実行します。/usr/glibc-compat/bin/locale -a コマンドが実行されると ja_JP.utf8 が表示されます。

f:id:ksby:20201228172510p:plain

ログイン画面から何も入力せずに「ログイン」ボタンを押すと日本語のメッセージが表示されました。

f:id:ksby:20201228172725p:plain

履歴

2020/12/28
初版発行。