Yerel ayarı Debian / Ubuntu Docker konteynerinde nasıl ayarlayabilirim?


124

Ubuntu Docker konteyneri çalıştırıyorum. Norveççe klavyem var ve Norveççe karakterleri (øæå) kullanmam gerekiyor.

Terminal karakter kodlamam UTF-8 olarak ayarlandı ve SSH kullanarak kapsayıcıma bağlandım. Ancak, Norveççe karakterleri yazamıyorum, Norveççe karakterleri kopyalayıp yapıştıramıyorum veya CTL + SHIFT + U + 00f8 kullanamıyorum.

Denedim:

locale-gen nb_NO.UTF-8

ama hiçbir şey değişmedi. Yerel ayarı ve klavyeyi bir Docker kapsayıcısı içinde nasıl ayarlarım?

Yanıtlar:


174

Dockerfile'ınıza aşağıdakilerden uyarlanmış bir şey koyun:

# 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     

bu, o konudaki çok iyi bir gönderiden alınmıştır.

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


1
Debian:
jessie'yi

22
apt-get -y install localesUbuntu kullanırken yapmanız gerekenler
user2915097

2
Ben eklemek zorunda RUN touch /usr/share/locale/locale.aliasçağrısı önce locale-genölümcül bir dosyayı önlemek için bulunamadı hatası
Paul Keister

6
sedSenaryo sakar türüdür. s/# \(en_US\.UTF-8 .*\)/\1/Yerini alan dizedeki arama ifadesini yakalayarak tekrar etmekten kaçınmaya çalışın .
üçlü

3
Eğer ek katmanlar oluşturarak kaçınmak istiyorsanız yazabilirsinizENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre Ravazzi

100

Debian kullananların da localespaket kurması gerekiyor .

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 

Bu cevap bana çok yardımcı oldu.


63

Sadece ekle

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

Dockerfile dosyanıza. ( localesPaketin kurulu olduğundan emin olmanız gerekebilir .) Temel işlem için başka hiçbir şeye gerek yoktur. Bu arada, Ubuntu dışında locale-genherhangi bir argüman kabul etmiyor, bu yüzden onu kullanan 'düzeltmelerin' hiçbiri örneğin Debian'da çalışmıyor. Ubuntu , locale-genoluşturulacak yerel ayarların bir listesini kabul etmek için yama uyguladı, ancak şu anda yama Debian'da başka hiçbir yerde kabul edilmedi.


1
Bir Ubuntu görüntüsünde benim için çalışmadı. Bu cevap yine de işe yaradı.
2017

4
Lütfen detay verir misiniz? C.UTF-8herhangi bir kurulum gerektirmeden tüm sistemlerde mevcuttur ve çoğunlukla yeterli olmalıdır .
andrewsh

Docker ubuntu ile çalışır: 18.04 görüntüsü. Sadece "LANG" e ihtiyacım vardı. Ben de yüklememe gerek yoktu locales.
wisbucky

1
Bunu yalnızca çalışma zamanında ayarlamak istiyorsanız, docker runbunun yerine komut
bağımsız

1
Ubuntu'da bunları yüklemeniz gerekirapt-get install -y locales
gerardnico

27

Aslında ben de aynı sorundan muzdarip oldum, ancak verilen cevapların hiçbiri debian ile% 100 çalışmıyor: en son, iyi ipuçları sağlasalar bile.

En büyük fark Emin hem yapmak gerektiğidir yerel ayarlar ve yerel ayarlar-tüm sen onu üretmek zorunda kalmamak için, ikincisi zaten en_US.UTF-8 içeren, yüklü olan yerel-gen veya dpkg-reconfigure .

İşte Dockerfile dosyamda çalışmasını sağlamak için yaptıklarım:

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
Yerel ayarlar-tümü paketinin açıklaması: Bu paket, desteklenen tüm yerel ayarlar için önceden derlenmiş yerel verileri içerir. Daha iyi bir alternatif, yerel ayarlar paketini kurmak ve yalnızca istenen yerel ayarları seçmektir, ancak düşük bellekli bir makinede yararlı olabilir çünkü bazı yerel ayar dosyaları derlenmek için çok fazla bellek alır.
user2707671

E: 'yerel ayarlar-tümü' paketinin kurulum adayı yok
AstraSerg

@AstraSerg: Bu hatayı almanıza çok şaşırdım. Çıktı nedir apt-cache show locales-all? Kesinlikle hala resmi bir pakettir ve Debian'da mevcuttur.
Jean

@Jean root @ paylaşım: / # apt-cache yerel ayarları-tümünü göster; cat / etc / issue N: Tamamen sanal olduğu için 'locales-all' paketinden sürümler seçilemiyor N: Ubuntu 18.04.1 LTS \ n \ l
AstraSerg

@AstraSerg: Aslında bunu sadece Debian için denediğimden beri Ubuntu'yu bilmiyorum (bkz. FROM debian: en son sağlanan Dockerfile kod parçacığında).
Jean

19

Komutunuzu çalıştırırken kullanarak LANGve LC_ALLortam değişkenlerini belirtin -e:

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

Dockerfile'ı değiştirmek gerekli değildir.


2
Bu arada, -eargümanlar docker-compose ile de çalışır.
Dag Høidahl

5
Bu işe yarar çünkü çoğu dağıtım C.UTF-8yerel ayarı içerir. Genellikle dile özgü yerel ayarları içermezler (örn. en_US.UTF-8). Bunun için yüklemeniz locales-all(büyük) veya bitirdikten sonra kurmanız localesve çalıştırmanız gerekir . locale-gen/etc/locale.gen
Jonathon Reinhart

5

İpucu: Docker Forumu gibi kapsayıcı dokümantasyon forumlarına göz atın .

İşte debian ve ubuntu için bir çözüm , Dockerfile'ınıza aşağıdakileri ekleyin:

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

3

Ubuntu / Debian'da yerel ayarları ayarlamak için bu karmaşık şeylere ihtiyacınız yok. İhtiyacın bile yok/etc/local.genDosyaya .

Basitçe locale-genher şeyi yapacak ve yazar sadece kaçırdığı localespaketi.

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

Bunu en basit ve en etkili olanı buldum. Ubuntu 16.04'te çalıştığını onaylıyorum.


2

@ Mixel'in yanıtı , sahip olduğumuz Ubuntu tabanlı docker imajı için harika çalıştı.

Bununla birlikte, tarifleri şef aracılığıyla ( kitchen-dockersürücüyü kullanarak ) test etmek için centos tabanlı bir docker imajımız da var . Önceden yüklediğimiz paketlerden biri, yerel ayar yapılmadığı için yüklenemedi. Bir yerel ayarı kurmak için aşağıdakileri çalıştırmam gerekiyordu:

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

Bu bilgiyi ServerFault üzerindeki bu cevaptan aldım .

Yukarıdaki komutları, herhangi bir hata olmadan kurulan paketin docker provizyonunun bir parçası olarak çalıştırdıktan sonra. Kimden .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

Bir Docker görüntüsü kullanıcısının onları değiştirmesini beklemediğimde Docker ortam değişkenlerine sahip olmaktan hoşlanmıyorum.

Sadece bir yerde bir yere koyun RUN. UTF-8 yerel ayarları oluşturmadıysanız, aşağıdaki komut setini uygulayabilirsiniz:

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

Bu, buradaki tek mantıklı cevap gibi görünüyordu çünkü ortam değişkenleriyle uğraşmaktan kaçınıyor. Ancak çalışmıyor. localeçıktı, sonraki komutları yürütürken veya sonraki RUNblokları yürütürken veya mevcut görüntüyü temel olarak kullanarak başka bir görüntü oluştururken değiştirilmez. Belki de bu değişiklikleri gerçekten uygulamak için bazı ek işlemler gerekli?
user7860670

Yukarıdaki komutlar, eğer eksik yerel ayarları nasıl oluşturacağınızdır. Bunları kullanmak istiyorsanız, bunu ortam değişkeni olarak ayarlamalısınız. Veya, bu yanıtı doğrudan RUN'un içinde veya Docker'ı beğenerek ayarlayarak önerdiğim ENVgibi ENV LC_ALL=en_US.UTF-8.
Mitar

-1

Yerel ayarlar paketini kurduktan sonra yerel ayarı sıfırlamak yerine noninteractive, paketi kurmadan önce normalde sorulacak (ile devre dışı bırakılır ) soruları yanıtlayarak paket komut dosyalarının yerel ayarı doğru şekilde ayarlamasını sağlayabilirsiniz, bu örnek yerel ayarı İngilizceye ayarlar ( İngiliz, 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

Benim için ubuntu görüntüsünde işe yarayan şey :

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

Bunu kullandım (sonra 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! 👌')"

Ve doğru yazdırır UTF8 works nice! 👌.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.