Spring Boot 2.2.x の Web アプリを 2.3.x へバージョンアップする ( その17 )( app コンテナを実行する Alpine Linux で ja_JP.utf8 のロケールを使えるようにする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- Alpine Linux ベースの app コンテナで Web アプリを実行すると日本語のメッセージが表示されないことに気づいたので、その問題を解消します。
参照したサイト・書籍
Dockerコンテナ上でJavaプログラムを動かすときにLANG環境変数を設定すると日本語のファイル名が文字化けする問題
https://qiita.com/Targityen/items/f921c95e684810d7087falpineベースのDockerイメージだとlocaledefが動かない
https://hacknote.jp/archives/26886/teikoku-penguin / alpine-ja_JP/ Dockerfile
https://github.com/teikoku-penguin/alpine-ja_JP/blob/master/Dockerfilesgerrand / alpine-pkg-glibc
https://github.com/sgerrand/alpine-pkg-glibcAdoptOpenJDK / openjdk-docker
https://github.com/AdoptOpenJDK/openjdk-dockerHow to set locale in Docker Alpine?
https://stackoverflow.com/questions/49042223/how-to-set-locale-in-docker-alpine「ロケール環境変数」の種類と優先順位まとめ【LC_ALL・LC_*・LANG・LANGUAGE】
https://linuxfan.info/locale-variables
目次
- Docker で Web アプリを実行すると日本語のメッセージが表示されない
- app コンテナの Alpine Linux に sgerrand/alpine-pkg-glibc をインストールして ja_JP.utf8 を使用可能にする
手順
Docker で Web アプリを実行すると日本語のメッセージが表示されない
動作確認をしていて気づいたのですが、IntelliJ IDEA から Web アプリを実行した時にはログイン画面から何も入力せずに「ログイン」ボタンを押すと日本語のメッセージが表示されますが、
Docker 上で adoptopenjdk/openjdk11:jdk-11.0.9.1_1-alpine-slim ベースのコンテナから Web アプリを実行した時には日本語のメッセージが表示されません。
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
のメッセージが表示されて、指定可能なロケールを確認することが出来ませんでした。
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 tzdata
→RUN 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 を作り直します。
docker-compose -f docker-compose.app.yml --compatibility up -d
コマンドで app コンテナを実行します。/usr/glibc-compat/bin/locale -a
コマンドが実行されると ja_JP.utf8
が表示されます。
ログイン画面から何も入力せずに「ログイン」ボタンを押すと日本語のメッセージが表示されました。
履歴
2020/12/28
初版発行。