KDOC 76: コンテナでLocaleを設定する
この文書のステータス
- 作成
- 2024-02-07 貴島
- レビュー
- 2024-02-08 貴島
概要
コンテナでLocaleを設定する方法をまとめる。普段ホストマシンとして動かしていると問題になることはないが、Dockerコンテナでは設定されていないので問題になることがある。たとえばファイル名に日本語が含まれるときに英語のままだと検索にかからなかったりする。
イントロ
Localeとは「その地域で使われる言語や通貨の単位などのまとまり」1のことである。
localectl
| System | Locale: | LANG=en_US.UTF-8 |
| LC_NUMERIC=ja_JP.UTF-8 | | |
| LC_MONETARY=ja_JP.UTF-8 | | |
| LC_PAPER=ja_JP.UTF-8 | | |
| LC_NAME=ja_JP.UTF-8 | | |
| LC_ADDRESS=ja_JP.UTF-8 | | |
| LC_TELEPHONE=ja_JP.UTF-8 | | |
| LC_MEASUREMENT=ja_JP.UTF-8 | | |
| LC_IDENTIFICATION=ja_JP.UTF-8 | | |
| VC | Keymap: | n/a |
| X11 | Layout: | jp |
| X11 | Model: | pc105 |
手順
手順は2段階である。Docker環境は公式のubuntuイメージで確認した。
- 言語パックをインストールする
- 環境変数を設定する
まず、インストール前に確認する。
locale -a
C
C.utf8
POSIX
このとき、日本語ファイルを表示すると文字化けする。
apt update
apt install language-pack-ja
locale -a
C
C.utf8
POSIX
ja_JP.utf8
Localeは環境変数で設定できるので、コマンド実行時にexportするか、DockerfileのEnvに記載する。以下はコマンド実行時にexportする例。
export LC_ALL=ja_JP.UTF-8
Locale前後でファイル名の日本語が正しく表示できるのを確認する。設定前はバイト列が見えている。
# 設定前
touch あ
ls
# => ''$'\343\201\202'
# ================
# ...
# ================
# 設定後
ls
# => あ
関連
抽象。
- 普段の環境では暗黙に設定済みのものが、最小構成の環境では未設定で問題になる
関連。
- 未解決: このケースでなぜ文字化けするのか。デフォルトでASCIIで処理しているということか
- 類似: KDOC 74: The input device is not a TTYを理解する。手元では当然あるものが、コンテナやCIの環境には無いために失敗する例。GitHub Actions上で docker run -i すると、TTYがないためエラーになる理由を調べている