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 locales
14.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 ファイルに入れることができます。