Bagaimana cara mengatur lokal di dalam kontainer Debian / Ubuntu Docker?

124

Saya menjalankan container Docker Ubuntu. Saya memiliki keyboard Norsk dan perlu menggunakan karakter Norsk (øæå).

Enkode karakter Terminal saya disetel ke UTF-8 dan saya terhubung ke penampung saya menggunakan SSH. Namun, saya tidak dapat mengetik karakter Norsk, atau menyalin dan menempelkan karakter Norsk, atau menggunakan CTL + SHIFT + U + 00f8.

Saya mencoba:

locale-gen nb_NO.UTF-8

tapi tidak ada yang berubah. Bagaimana cara mengatur lokal dan keyboard di dalam container Docker?

mtmacdonald
sumber

Jawaban:

172

Masukkan sesuatu yang diadaptasi dari Dockerfile Anda

# 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     

ini diambil dari postingan yang sangat bagus tentang topik tersebut, dari

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

pengguna2915097
sumber
1
Ini tidak berfungsi ketika Anda menggunakan debian: jessie sebagai wadah dasar
iDexter
22
Anda perlu apt-get -y install localessaat menggunakan Ubuntu
user2915097
2
Saya harus menambahkan RUN touch /usr/share/locale/locale.aliassebelum panggilan ke locale-genuntuk menghindari file fatal tidak ditemukan kesalahan
Paul Keister
6
The sedScript adalah jenis canggung. Cobalah s/# \(en_US\.UTF-8 .*\)/\1/untuk menghindari pengulangan frase pencarian dalam string pengganti dengan menangkapnya.
tripleee
3
Jika Anda ingin menghindari membuat lapisan tambahan, Anda dapat menulisENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre Ravazzi
100

Mereka yang menggunakan Debian juga harus menginstal locales paket.

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 

Jawaban ini sangat membantu saya.

mixel
sumber
63

Tambahkan saja

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

ke Dockerfile Anda. (Anda mungkin perlu memastikan localespaket telah diinstal.) Tidak ada lagi yang diperlukan untuk operasi dasar. Sementara itu, di luar Ubuntu, locale-gentidak menerima argumen apa pun, itulah mengapa tidak ada 'perbaikan' yang menggunakannya, misalnya di Debian. Ubuntu telah menambal locale-genuntuk menerima daftar lokal yang akan dibuat tetapi tambalan tersebut saat ini belum diterima di Debian di mana pun.

andrewsh
sumber
1
Tidak berhasil untuk saya pada image Ubuntu. Jawaban ini berhasil.
dialex
4
Bisakah Anda memberikan rinciannya? C.UTF-8tersedia pada semua sistem tanpa perlu menginstal apapun, dan harus sebagian besar cukup.
andrewsh
Bekerja dengan Docker ubuntu: 18.04 image. Saya hanya butuh "LANG". Saya juga tidak perlu menginstal locales.
wisbucky
1
Jika Anda hanya ingin menyetel ini saat runtime, Anda dapat menyetel env vars di docker runperintah args sebagai gantinya: stackoverflow.com/questions/28405902/…
wisbucky
1
Di Ubuntu, Anda perlu menginstalnyaapt-get install -y locales
gerardnico
27

Saya sebenarnya mengalami masalah yang sama, tetapi tidak ada jawaban yang diberikan 100% berfungsi dengan debian: terbaru, meskipun memberikan petunjuk yang baik.

Perbedaan terbesarnya adalah Anda harus memastikan baik locales dan locales-all sudah diinstal, yang terakhir sudah berisi en_US.UTF-8, jadi Anda tidak perlu membuatnya dengan local-gen atau dpkg-reconfigure .

Inilah yang telah saya lakukan di Dockerfile saya untuk membuatnya berfungsi:

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
Jean
sumber
2
Deskripsi paket locales-all memiliki: Paket ini berisi data lokal yang telah dikompilasi untuk semua lokal yang didukung. Alternatif yang lebih baik adalah menginstal paket locales dan hanya memilih lokal yang diinginkan, tetapi ini dapat berguna pada mesin dengan memori rendah karena beberapa file lokal membutuhkan banyak memori untuk dikompilasi.
pengguna2707671
E: Paket 'locales-all' tidak memiliki kandidat instalasi
AstraSerg
@AstraSerg: Saya sangat terkejut Anda mendapatkan kesalahan itu. Apa ouputnya apt-cache show locales-all? Ini pasti masih paket resmi dan tersedia di Debian.
Jean
@Jean root @ share: / # apt-cache show locales-all; cat / etc / issue N: Tidak dapat memilih versi dari paket 'locales-all' karena ini murni virtual N: Tidak ada paket yang ditemukan Ubuntu 18.04.1 LTS \ n \ l
AstraSerg
@AstraSerg: Saya sebenarnya tidak tahu tentang Ubuntu karena saya mencobanya hanya untuk Debian (lihat DARI debian: terbaru di cuplikan Dockerfile yang saya sediakan).
Jean
19

Tentukan variabel LANGdan LC_ALLlingkungan yang digunakan -esaat menjalankan perintah Anda:

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

Tidak perlu memodifikasi Dockerfile.

Dag Høidahl
sumber
2
The -eargumen bekerja dengan buruh pelabuhan-compose juga, by the way.
Dag Høidahl
5
Ini berfungsi karena sebagian besar distro menyertakan C.UTF-8lokal. Mereka biasanya tidak menyertakan bahasa lokal tertentu (misalnya en_US.UTF-8). Untuk itu Anda perlu menginstal locales-all(besar) atau menginstal localesdan menjalankan locale-gensetelah berakhir /etc/locale.gen.
Jonathon Reinhart
5

Tip: Jelajahi forum dokumentasi container, seperti Docker Forum .

Berikut solusi untuk debian & ubuntu , tambahkan yang berikut ini ke Dockerfile Anda:

RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.UTF-8
Eduardo Santana
sumber
3

Kalian tidak memerlukan hal-hal rumit itu untuk mengatur lokal di Ubuntu / Debian. Anda bahkan tidak membutuhkan /etc/local.genfile.

Cukup locale-genakan melakukan segalanya dan penulis hanya melewatkan localespaket.

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

Menurut saya ini yang paling sederhana dan paling efektif. Saya mengonfirmasi itu berfungsi di Ubuntu 16.04.

Bumsik Kim
sumber
2

@ Mixel ini jawaban bekerja besar bagi citra buruh pelabuhan berbasis Ubuntu yang kita miliki.

Namun, kami juga memiliki gambar buruh pelabuhan berbasis centos untuk menguji resep melalui chef (menggunakan kitchen-dockersopir). Salah satu paket yang kami pasang sebelumnya gagal dipasang karena tidak ada lokal yang disetel. Untuk menginstal lokal, saya harus menjalankan yang berikut ini:

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

Saya mendapat informasi ini dari jawaban ini di ServerFault .

Setelah menjalankan perintah di atas sebagai bagian dari docker yang menyediakan paket yang diinstal tanpa kesalahan apa pun. Dari .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
E. Moffat
sumber
1

Saya tidak suka memiliki variabel lingkungan Docker ketika saya tidak mengharapkan pengguna image Docker untuk mengubahnya.

Taruh saja di suatu tempat RUN. Jika Anda tidak membuat lokal UTF-8, Anda dapat melakukan serangkaian perintah berikut:

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
Mitar
sumber
Ini tampaknya menjadi satu-satunya jawaban yang waras di sini karena menghindari masalah dengan variabel lingkungan. Namun itu tidak berhasil. localekeluaran tidak berubah saat menjalankan perintah berikutnya, atau saat menjalankan RUNblok berikutnya , atau saat membuat gambar lain menggunakan gambar saat ini sebagai basis. Mungkin beberapa tindakan tambahan diperlukan untuk benar-benar menerapkan perubahan ini?
pengguna7860670
Perintah di atas adalah bagaimana Anda menghasilkan lokal jika Anda melewatkannya. Jika Anda ingin menggunakannya, Anda harus mengaturnya sebagai variabel lingkungan. Atau, seperti yang saya usulkan dalam jawaban ini langsung di dalam RUN, atau, dengan menyetel ENVseperti Docker ENV LC_ALL=en_US.UTF-8.
Mitar
-1

Daripada mengatur ulang lokal setelah instalasi paket locales, Anda dapat menjawab pertanyaan yang biasanya ditanyakan (yang dinonaktifkan oleh noninteractive) sebelum menginstal paket sehingga skrip paket mengatur lokal dengan benar, contoh ini mengatur lokal ke bahasa Inggris ( Inggris, 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/*
Matthew Buckett
sumber
-1

Bagi saya apa yang berhasil di gambar 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
alexopoulos7
sumber
-1

Saya menggunakan ini (setelah 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! 👌')"

Dan itu mencetak UTF8 works nice! 👌dengan benar.

Carlos Pinzón
sumber