Jak ustawić ustawienia regionalne w kontenerze Debian / Ubuntu Docker?

124

Używam kontenera Ubuntu Docker. Mam klawiaturę norweską i muszę używać norweskich znaków (øæå).

Kodowanie znaków mojego terminala jest ustawione na UTF-8 i jestem połączony z kontenerem przy użyciu protokołu SSH. Nie mogę jednak wpisywać norweskich znaków, kopiować i wklejać norweskich znaków ani używać CTL + SHIFT + U + 00f8.

Próbowałem:

locale-gen nb_NO.UTF-8

ale nic się nie zmieniło. Jak ustawić ustawienia regionalne i klawiaturę w kontenerze Docker?

mtmacdonald
źródło

Odpowiedzi:

173

Umieść plik Dockerfile zaadaptowany z

# 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     

to pochodzi z bardzo dobrego posta na ten temat, z

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

user2915097
źródło
1
To nie działa, gdy używasz debian: jessie jako kontenera podstawowego
iDexter
22
co musisz, apt-get -y install localeskorzystając z Ubuntu
user2915097
2
Musiałem dodać RUN touch /usr/share/locale/locale.aliasprzed wezwaniem locale-gen, aby uniknąć fatalnego błędu nie znaleziono pliku
Paul Keister
6
sedSkrypt jest trochę niezdarny. Staraj s/# \(en_US\.UTF-8 .*\)/\1/się unikać powtarzania frazy wyszukiwania w ciągu zastępczym, przechwytując ją.
tripleee
3
Jeśli chcesz uniknąć tworzenia dodatkowych warstw, możesz napisaćENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre Ravazzi,
100

Ci, którzy używają Debiana, również muszą zainstalować localespakiet.

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 

Ta odpowiedź bardzo mi pomogła.

mixel
źródło
63

Poprostu dodaj

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

do pliku Dockerfile. (Może być konieczne upewnienie się, że localespakiet jest zainstalowany). Nic więcej nie jest potrzebne do podstawowej operacji. Tymczasem poza Ubuntu locale-gennie przyjmuje żadnych argumentów, dlatego żadna z „poprawek” go używających nie działa np. Na Debianie. Ubuntu załatało, locale-genaby zaakceptować listę lokalizacji do wygenerowania, ale w tej chwili łatka nie została zaakceptowana w Debianie nigdzie indziej.

andrewsh
źródło
1
Nie działa dla mnie na obrazie Ubuntu. Ta odpowiedź jednak zadziałała.
dialex
4
Czy mógłbyś podać jakieś szczegóły? C.UTF-8jest dostępna we wszystkich systemach bez konieczności instalowania czegokolwiek, i powinno być przede wszystkim mało.
andrewsh
Działa z obrazem Docker ubuntu: 18.04. Potrzebowałem tylko „LANG”. Nie musiałem też instalować locales.
wisbucky
1
Jeśli chcesz ustawić to tylko w czasie wykonywania, możesz ustawić docker run
zmienne
1
Na Ubuntu musisz je zainstalowaćapt-get install -y locales
gerardnico
27

Tak się złożyło, że miałem ten sam problem, ale żadna z podanych odpowiedzi nie działa w 100% z debianem: najnowsze, nawet jeśli zawierają dobre wskazówki.

Największą różnicą jest to, że należy upewnić się, obie lokalizacje i locales-wszystkie są zainstalowane, to ostatnie już zawierających en_US.UTF-8, dzięki czemu nie trzeba wygenerować go z lokalnego-gen lub dpkg-reconfigure .

Oto, co zrobiłem w moim pliku Dockerfile, aby to działało:

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
Drelich
źródło
2
Opis pakietu locales-all zawiera: Ten pakiet zawiera prekompilowane dane regionalne dla wszystkich obsługiwanych ustawień regionalnych. Lepszą alternatywą jest zainstalowanie pakietu ustawień regionalnych i wybranie tylko żądanych ustawień regionalnych, ale może to być przydatne na komputerze z małą ilością pamięci, ponieważ kompilacja niektórych plików ustawień regionalnych zajmuje dużo pamięci.
user2707671
E: Pakiet „locales-all” nie ma kandydata do instalacji
AstraSerg
@ AstraSerg: Jestem bardzo zaskoczony, że dostałeś ten błąd. Jaki jest wynik apt-cache show locales-all? Jest to zdecydowanie nadal oficjalny pakiet dostępny w Debianie.
Jean,
@Jean root @ share: / # apt-cache show locales-all; cat / etc / issue N: Nie można wybrać wersji z pakietu „locales-all”, ponieważ jest on czysto wirtualny N: Nie znaleziono żadnych pakietów Ubuntu 18.04.1 LTS \ n \ l
AstraSerg
@AstraSerg: Właściwie to nie wiem o Ubuntu, ponieważ próbowałem tego tylko dla Debiana (zobacz OD debian: najnowsze we fragmencie Dockerfile, który dostarczyłem).
Jean
19

Określ zmienne środowiskowe LANGi, LC_ALLużywając -epodczas uruchamiania polecenia:

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

Nie ma potrzeby modyfikowania pliku Dockerfile.

Dag Høidahl
źródło
2
Te -eargumenty pracować z Docker-komponować także, przy okazji.
Dag Høidahl
5
To działa, ponieważ większość dystrybucji zawiera C.UTF-8ustawienia regionalne. Zwykle nie zawierają ustawień regionalnych (np en_US.UTF-8.). W tym celu musisz zainstalować locales-all(duży) lub zainstalować localesi uruchomić locale-genpo zakończeniu /etc/locale.gen.
Jonathon Reinhart
5

Wskazówka: przejrzyj fora dokumentacji kontenerów, takie jak forum Docker .

Oto rozwiązanie dla debian i ubuntu , dodaj następujące informacje do pliku Dockerfile:

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
źródło
3

Nie potrzebujecie tych skomplikowanych rzeczy, aby ustawić lokalizacje na Ubuntu / Debian. Nie potrzebujesz nawet /etc/local.genpliku.

Po prostu locale-genzrobię wszystko, a autorowi tylko brakowało localespakietu.

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

Uważam, że to najprostsze i najskuteczniejsze. Potwierdzam, że działa na Ubuntu 16.04.

Bumsik Kim
źródło
2

@ Mixel za odpowiedź pracował wielki dla Döcker Ubuntu opartej na obrazie mamy.

Mamy jednak również obraz dockera oparty na centos do testowania receptur za pomocą szefa kuchni (przy użyciu kitchen-dockersterownika). Nie udało się zainstalować jednego z wstępnie zainstalowanych pakietów z powodu braku ustawień regionalnych. Aby zainstalować locale, musiałem uruchomić:

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

Otrzymałem tę informację z tej odpowiedzi w ServerFault .

Po uruchomieniu powyższych poleceń w ramach aprowizacji dockera pakiet instaluje się bez żadnych błędów. Od .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
źródło
1

Nie lubię mieć zmiennych środowiskowych Dockera, kiedy nie oczekuję, że użytkownik obrazu Dockera je zmieni.

Po prostu umieść to gdzieś w jednym RUN. Jeśli nie masz wygenerowanych ustawień regionalnych UTF-8, możesz wykonać następujący zestaw poleceń:

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
źródło
Wydawało się, że jest to jedyna rozsądna odpowiedź, ponieważ pozwala uniknąć wkręcania się w zmienne środowiskowe. Jednak to nie działa. localedane wyjściowe nie są zmieniane podczas wykonywania kolejnych poleceń ani podczas wykonywania kolejnych RUNbloków ani podczas budowania kolejnego obrazu przy użyciu bieżącego obrazu jako podstawy. Może potrzebne są dodatkowe działania, aby faktycznie zastosować te zmiany?
user7860670
Powyższe polecenia opisują sposób generowania ustawień regionalnych, jeśli ich brakuje. Jeśli chcesz ich używać, musisz ustawić je jako zmienną środowiskową. Lub, jak proponuję w tej odpowiedzi, bezpośrednio w RUN lub, ustawiając Docker ENVjak ENV LC_ALL=en_US.UTF-8.
Mitar
-1

Zamiast resetować ustawienia regionalne po zainstalowaniu pakietu ustawień regionalnych, możesz odpowiedzieć na pytania, które normalnie byłyby zadawane (co jest wyłączone przez noninteractive) przed zainstalowaniem pakietu, aby skrypty pakietu poprawnie skonfigurowały ustawienia regionalne, ten przykład ustawia język angielski ( Brytyjski, 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
źródło
-1

Dla mnie, co działało w obrazie 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
źródło
-1

Użyłem tego (po 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! 👌')"

I drukuje UTF8 works nice! 👌poprawnie.

Carlos Pinzón
źródło