ロケールを手動で正しく設定するにはどうすればよいですか?

ロケールを手動で正しく設定するにはどうすればよいですか?

Dockerイメージを作成していますが、Ubuntu 14.04 ロケールを正しく設定するのに問題があります。

(14.04がEOLであることを知っていますが、それでも動作するはずです。そうですか?askubuntu.comでUbuntuの人々のサポートが拒否されたので、ここで幸運を試してみましょう。)

私のDockerfile外観:

COPY .bashrc /root/.bashrc
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y build-essential \
                       locales
RUN dpkg-reconfigure locales
WORKDIR /home/prs/

どこ.bashrc

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

エラーなしでビルドされますが、docker build -t "test" .実行すると次の出力が表示されます。

$ docker run -it test
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory
root@d09247a538eb:/# source /root/.bashrc 
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
root@d09247a538eb:/# 

私も次のことを試しました。

echo "LANG=en_US.UTF-8" > /etc/locale.conf

私はまだ次のようになります。

# locale-gen
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

どうなりますか?ロケールを正しく設定するには?

修正する:

私のコンテナイメージが次のものに基づいている場合は、入力中に選択できUbuntu 18.04ますが(現在必要なもの)を使用すると、次のような結果が得られます。locale# dpkg-reconfigure locales14.04

# dpkg-reconfigure locales
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "en_US.UTF-8",
        LC_ALL = "en_US.UTF-8",
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

また、Eduardo Trápani(@EduardoTrápani)が以下の提案に従ってロケールを手動で実行してみました。

# echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen
en_US.UTF-8 UTF-8
# locale-gen
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

locale-genもう1つのヒントは、locales/sup[ported.dディレクトリに何もないことです(http://manpages.ubuntu.com/manpages/precise/man8/localeでこれを正しく理解した場合はこれが結果でなければなりません)。 .8.html):

# ls -l /var/lib/locales/supported.d/  

合計0

答え1

見ている問題は、デフォルトでC(とも呼ばれるPOSIX)および(UTF-8バージョン)C.UTF-8以外のDockerコンテナに組み込まれたロケールがないことです。これは、glibcには多くのスペースを占めるロケールが多数含まれており、DebianとUbuntuはスペースを節約するためにパッケージに圧縮されたバージョンのみを提供するため、システムlocalesに特定のロケールを構築する必要があるためです。

UTF-8を使用する英語のロケールだけを探している場合は、それがC.UTF-8あなたのニーズに適している可能性があり、コンテナに新しいロケールを構築する必要はありません。簡単に使用できますLC_ALL=C.UTF-8 docker run -it test

しかし、特にアメリカ英語のロケールが必要な場合(たとえば、Avoirdupoisシステムが何らかの奇妙な理由で本当に好きで、それらを一緒に使用したい場合LC_MEASUREMENT)、最も簡単な回避策はlocales-allパッケージをインストールすることです。これにより、すべてのロケールに対して事前にビルドされたバージョンが提供されます。

または、スペースが不足している場合は、Dockerfileを更新して次の行を追加できます。

RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen

これにより、目的のロケールが構築されます。

究極の解決策は、.bashrcロケールが有効かどうかを検出し、そうでない場合は別の値に設定することです。私は英語が母国語ですが、フランス語のロケールを頻繁に使用しています。次のコマンドを実行できます。$localeそのロケールが存在する場合は 0 で終了し、それ以外の場合は 0 以外の値で終了します。

$ perl -MPOSIX=locale_h -E 'exit !setlocale(LC_ALL, $ARGV[0]);' "$locale" \
  2>/dev/null

答え2

にロケールを追加して/etc/locale.genビルドしてから使用できます。

$ sudo echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen
$ sudo locale-gen

これらのコマンドを docker ファイルに入れることができます。

関連情報