Debian / Ubuntu Dockerコンテナー内でロケールを設定する方法は?


124

Ubuntu Dockerコンテナーを実行しています。私はノルウェー語のキーボードを使用しており、ノルウェー語の文字(øæå)を使用する必要があります。

ターミナルの文字エンコーディングがUTF-8に設定されており、SSHを使用してコンテナに接続しています。ただし、ノルウェー語の文字を入力したり、ノルウェー語の文字をコピーして貼り付けたり、CTL + SHIFT + U + 00f8を使用したりできません。

私は試した:

locale-gen nb_NO.UTF-8

しかし、何も変わっていません。Dockerコンテナー内でロケールとキーボードを設定するにはどうすればよいですか?

回答:


172

Dockerfileに何かを適応させます

# Set the locale
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    locale-gen
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8     

これは、その主題に関する非常に優れた投稿から抽出されました。

http://jaredmarkell.com/docker-and-locales/


1
ベースコンテナーとしてdebian:jessieを使用すると機能しない
iDexter '27

22
apt-get -y install localesUbuntuを使用する場合に必要
user2915097

2
致命的なファイルが見つからないというエラーを回避するためRUN touch /usr/share/locale/locale.aliasに、呼び出しの前に追加しなければなりlocale-genませんでした
Paul Keister

6
sedこのスクリプトは、不器用なの一種です。s/# \(en_US\.UTF-8 .*\)/\1/置換文字列をキャプチャして、検索文字列が繰り返されないようにしてください。
tripleee

3
追加のレイヤーの作成を避けたい場合は、次のように書くことができますENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre Ravazzi

100

Debianを使用する人もlocalesパッケージをインストールする必要があります。

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales

RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=en_US.UTF-8

ENV LANG en_US.UTF-8 

この答えは私に大いに役立ちました。


63

追加するだけ

ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

あなたのDockerfileに。(localesパッケージがインストールされていることを確認する必要がある場合があります。)基本的な操作には他に何も必要ありません。一方、Ubuntuの外では、locale-gen引数を受け入れません。そのため、それを使用する「修正」がDebian などで機能しません。Ubuntu locale-gen、生成するロケールのリストを受け入れるようにパッチを当てましたが、現時点では、そのパッチは他のどこのDebianでも受け入れられていません。


1
Ubuntuイメージでは機能しませんでした。この答えはうまくいった。
dialex 2017

4
詳細を教えてください。C.UTF-8何もインストールする必要がなく、すべてのシステムで利用でき、ほとんどで十分です。
アンドリューシュ

Docker ubuntu:18.04イメージで動作します。「LANG」だけが必要でした。私もインストールする必要はありませんでしたlocales
wisbucky

1
あなたは、実行時にのみ、これを設定したい場合は、ENVがでvarsの設定ができdocker run代わりに、コマンドの引数:stackoverflow.com/questions/28405902/...
wisbucky

1
Ubuntuでは、それらをインストールする必要がありますapt-get install -y locales
gerardnico

27

私は実際に同じ問題に遭遇したことがありますが、提供された回答のいずれも、良いヒントが提供されていても、debian:latestで100%機能していません。

最大の違いは、locales locales-allの両方がインストールされていることを確認する必要があることです。後者にはすでにen_US.UTF-8が含まれているため、local-genまたはdpkg-reconfigureで生成する必要はありません。

これを機能させるためにDockerfileで行ったことは次のとおりです。

FROM debian:latest
RUN apt-get update
RUN apt-get install -y locales locales-all
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8

2
locales-allパッケージの説明:このパッケージには、サポートされているすべてのロケールのプリコンパイル済みロケールデータが含まれています。より良い代替策は、localesパッケージをインストールして必要なロケールのみを選択することですが、一部のロケールファイルはコンパイルに大量のメモリを必要とするため、メモリの少ないマシンで役立ちます。
user2707671

E:パッケージ「locales-all」にインストール候補がない
AstraSerg

@AstraSerg:あなたがそのエラーを受け取ったのは非常に驚きです。の出力は何apt-cache show locales-allですか?それは間違いなくまだ公式パッケージであり、Debianで利用可能です。
Jean

@Jean root @ share:/#apt-cache show locales-all; cat / etc / issue N:パッケージ 'locales-all'からバージョンを選択できません。純粋に仮想ですN:パッケージが見つかりませんUbuntu 18.04.1 LTS \ n \ l
AstraSerg

@AstraSerg:Debianのみで試したため、Ubuntuについては実際にはわかりません(提供したDockerfileスニペットのFROM debian:latestを参照してください)。
Jean、

19

コマンドの実行時にLANGLC_ALLを使用-eして環境変数を指定します。

docker run -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -it --rm <yourimage> <yourcommand>

Dockerfileを変更する必要はありません。


2
-e引数は道によって、また、ドッキングウィンドウ・コンで動作します。
DagHøidahl18年

5
これは、ほとんどのディストリビューションにC.UTF-8ロケールが含まれているため機能します。通常、言語固有のロケール(例:)は含まれませんen_US.UTF-8。そのためには、ot install locales-all(big)またはインストール後に終了してlocales実行する必要があります。locale-gen/etc/locale.gen
Jonathon Reinhart


3

Ubuntu / Debianでロケールを設定するのに、これらの複雑なことは必要ありません。/etc/local.genファイルも必要ありません。

単にlocale-genすべてを行い、作者はlocalesパッケージを逃しただけです。

RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
 && locale-gen "en_US.UTF-8"
ENV LANG=en_US.UTF-8 \
    LANGUAGE=en_US:en \
    LC_ALL=en_US.UTF-8

私はこれが最も簡単で最も効果的だと思いました。Ubuntu 16.04で動作することを確認しました。


2

@Mixelの答えは、私たちが持っているUbuntuベースのDockerイメージに最適です。

ただし、シェフを介して(kitchen-dockerドライバーを使用して)レシピをテストするためのCentosベースのDockerイメージもあります。ロケールが設定されていないため、プレインストールしたパッケージの1つがインストールに失敗していました。ロケールをインストールするために、以下を実行する必要がありました。

localedef -c -f UTF-8 -i en_US en_US.UTF-8
export LC_ALL=en_US.UTF-8

ServerFaultのこの回答からこの情報を入手しました。

Dockerプロビジョニングの一部として上記のコマンドを実行した後、エラーなしでインストールされたパッケージ。から.kitchen.yml

platforms:
  - name: centos7
    driver_config:
      image: #(private image)
      platform: centos
      provision_command:
      - localedef -c -f UTF-8 -i en_US en_US.UTF-8
      - export LC_ALL=en_US.UTF-8

1

Dockerイメージのユーザーが環境変数を変更することを期待していないときに、Docker環境変数を使用するのは嫌いです。

ちょうど1つのどこかにそれを置きRUNます。UTF-8ロケールが生成されていない場合は、次の一連のコマンドを実行できます。

export DEBIAN_FRONTEND=noninteractive
apt-get update -q -q
apt-get install --yes locales
locale-gen --no-purge en_US.UTF-8
update-locale LANG=en_US.UTF-8
echo locales locales/locales_to_be_generated multiselect en_US.UTF-8 UTF-8 | debconf-set-selections
echo locales locales/default_environment_locale select en_US.UTF-8 | debconf-set-selections
dpkg-reconfigure locales

これは、環境変数のねじ込みを回避するため、ここでの唯一の正解であるように思われました。ただし、機能しません。locale後続のコマンドを実行するとき、後続のRUNブロックを実行するとき、または現在のイメージをベースとして使用して別のイメージを構築するとき、出力は変更されません。これらの変更を実際に適用するには、追加のアクションが必要なのでしょうか?
user7860670

上記のコマンドは、ロケールがない場合にロケールを生成する方法です。それらを使用する場合は、環境変数として設定する必要があります。または、私がこの回答で直接提案しているENVように、またはDockerをのように設定しますENV LC_ALL=en_US.UTF-8
Mitar

-1

ロケールパッケージのインストール後にロケールをリセットするのではなくnoninteractive、パッケージスクリプトをインストールしてロケールを正しくセットアップするために、パッケージをインストールする前に通常尋ねられる質問(によって無効にされる)に答えることができます。この例では、ロケールを英語に設定します(イギリス、UTF-8):

RUN echo locales locales/default_environment_locale select en_GB.UTF-8 | debconf-set-selections
RUN echo locales locales/locales_to_be_generated select "en_GB.UTF-8 UTF-8" | debconf-set-selections

RUN \
  apt-get update && \
  DEBIAN_FRONTEND=noninteractive apt-get install -y locales && \
  rm -rf /var/lib/apt/lists/*

-1

私にとってubuntuイメージで機能したもの:

FROM ubuntu:xenial
USER root
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install --no-install-recommends -y locales && rm -rf /var/lib/apt/lists/*
RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
RUN echo "LANG=en_US.UTF-8" > /etc/locale.conf

-1

私はこれを使用しました(後RUN apt-get install -y python3):

RUN apt-get install -y locales
RUN apt-get install -y language-pack-en
ENV LANG en_US.UTF-8 
ENV LANGUAGE en_US:en 
ENV LC_ALL en_US.UTF-8
RUN python3 -c "print('UTF8 works nice! 👌')"

そして、UTF8 works nice! 👌正しく印刷されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.