Làm cách nào để đặt ngôn ngữ bên trong thùng chứa Debian / Ubuntu Docker?


122

Tôi đang chạy một container Ubuntu Docker. Tôi có một bàn phím tiếng Na Uy và cần sử dụng các ký tự tiếng Na Uy (øæå).

Mã hóa ký tự Terminal của tôi được đặt thành UTF-8 và tôi được kết nối với vùng chứa của mình bằng SSH. Tuy nhiên, tôi không thể nhập các ký tự Na Uy, cũng không sao chép và dán các ký tự Na Uy, cũng không sử dụng CTL + SHIFT + U + 00f8.

Tôi đã thử:

locale-gen nb_NO.UTF-8

nhưng không có gì thay đổi. Làm cách nào để đặt ngôn ngữ và bàn phím bên trong thùng chứa Docker?

Câu trả lời:


170

Đặt trong Dockerfile của bạn một cái gì đó thích nghi từ

# 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     

điều này được trích từ bài viết rất hay về chủ đề đó, từ

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


1
Nó không hoạt động khi bạn sử dụng debian: jessie làm thùng chứa cơ sở
iDexter

22
bạn cần apt-get -y install localeskhi sử dụng Ubuntu
user2915097 16/2/18

2
Tôi đã phải thêm RUN touch /usr/share/locale/locale.aliastrước cuộc gọi đến locale-genđể tránh lỗi nghiêm trọng không tìm thấy tệp
Paul Keister

6
Các sedkịch bản là loại vụng về. Cố gắng s/# \(en_US\.UTF-8 .*\)/\1/tránh lặp lại cụm từ tìm kiếm trong chuỗi thay thế bằng cách nắm bắt nó.
tripleee

3
Nếu bạn muốn tránh tạo các lớp bổ sung, bạn có thể viếtENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
Andre Ravazzi

99

Những người sử dụng Debian cũng phải cài đặt localesgói.

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 

Câu trả lời này đã giúp tôi rất nhiều.


63

Chỉ cần thêm

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

vào Dockerfile của bạn. (Bạn có thể cần đảm bảo localesgói được cài đặt.) Không có gì khác là cần thiết cho hoạt động cơ bản. Trong khi đó, bên ngoài Ubuntu, locale-genkhông chấp nhận bất kỳ đối số nào, đó là lý do tại sao không có 'bản sửa lỗi' nào sử dụng nó hoạt động, ví dụ như trên Debian. Ubuntu đã vá locale-genđể chấp nhận một danh sách các địa điểm sẽ tạo nhưng bản vá tại thời điểm này chưa được chấp nhận trong Debian ở bất kỳ nơi nào khác.


1
Không làm việc cho tôi trên một hình ảnh Ubuntu. Câu trả lời này làm việc mặc dù.
dialex

4
Bạn có thể vui lòng cho biết bất kỳ chi tiết? C.UTF-8có sẵn trên tất cả các hệ thống mà không cần phải cài đặt bất cứ thứ gì, và nó hầu như là đủ.
andrewsh

Hoạt động với hình ảnh Docker ubfox: 18.04. Tôi chỉ cần "LANG". Tôi cũng không cần cài đặt locales.
wvducky

1
Nếu bạn chỉ muốn thiết lập điều này trong thời gian chạy, bạn có thể đặt các env vars trong docker runlệnh args thay vào đó: stackoverflow.com/questions/28405902/
Kẻ

1
Trên Ubuntu, bạn cần cài đặt chúngapt-get install -y locales
gerardnico

27

Tôi thực sự đã gặp phải vấn đề tương tự, nhưng không có câu trả lời nào được cung cấp 100% hoạt động với debian: mới nhất, ngay cả khi chúng cung cấp gợi ý tốt.

Sự khác biệt lớn nhất là bạn nên đảm bảo cả hai ngôn ngữ địa phương - tất cả đã được cài đặt, cái sau đã chứa en_US.UTF-8, vì vậy bạn không phải tạo nó với local-gen hoặc dpkg-cấu hình lại .

Đây là những gì tôi đã làm trong Dockerfile của mình để làm cho nó hoạt động:

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
Mô tả về gói loc-all có: Gói này chứa dữ liệu miền địa phương được biên dịch sẵn cho tất cả các vùng được hỗ trợ. Một cách khác tốt hơn là cài đặt gói cục bộ và chỉ chọn các vị trí mong muốn, nhưng nó có thể hữu ích trên máy có bộ nhớ thấp vì một số tệp cục bộ cần rất nhiều bộ nhớ để được biên dịch.
user2707671

E: Gói '
loc

@AstraSerg: Tôi rất ngạc nhiên khi bạn gặp phải lỗi đó. Ý nghĩa của việc apt-cache show locales-allgì? Đây chắc chắn vẫn là một gói chính thức và có sẵn trong Debian.
Jean

@Jean root @ share: / # apt-cache hiển thị loc-all; cat / etc / vấn đề N: Không thể chọn phiên bản từ gói 'loc-all' vì nó hoàn toàn là ảo N: Không có gói nào được tìm thấy Ubuntu 18.04.1 LTS \ n \ l
AstraSerg

@AstraSerg: Tôi thực sự không biết về Ubuntu vì tôi đã thử nó chỉ cho Debian (xem TỪ debian: mới nhất trong đoạn trích Dockerfile tôi cung cấp).
Jean

19

Chỉ định các biến LANGLC_ALLmôi trường sử dụng -ekhi chạy lệnh của bạn:

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

Không cần thiết phải sửa đổi Dockerfile.


2
Các -eđối số cũng hoạt động với docker-compose.
Dag Høidahl

5
Điều này hoạt động bởi vì hầu hết các distro bao gồm C.UTF-8miền địa phương. Chúng thường không bao gồm các ngôn ngữ cụ thể theo ngôn ngữ (ví dụ en_US.UTF-8). Cho rằng bạn cần cài đặt ot locales-all(lớn) hoặc cài đặt localesvà chạy locale-gensau khi kết thúc /etc/locale.gen.
Jonathon Reinhart

5

Mẹo: Duyệt các diễn đàn tài liệu về container, như Diễn đàn Docker .

Đây là một giải pháp cho debian & ubfox, hãy thêm phần sau vào Dockerfile của bạn:

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

Các bạn không cần những thứ phức tạp đó để đặt cục bộ trên Ubuntu / Debian. Bạn thậm chí không cần /etc/local.gentập tin.

Đơn giản locale-gensẽ làm mọi thứ và tác giả chỉ bỏ lỡ localesgói.

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

Tôi thấy đây là cách đơn giản và hiệu quả nhất. Tôi xác nhận nó hoạt động trên Ubuntu 16.04.


2

Câu trả lời của @ Mixel đã làm việc rất tốt cho hình ảnh docker dựa trên Ubuntu mà chúng ta có.

Tuy nhiên, chúng tôi cũng có một hình ảnh docker dựa trên centos để thử nghiệm công thức nấu ăn thông qua đầu bếp (sử dụng kitchen-dockertrình điều khiển). Một trong những gói chúng tôi cài đặt trước không cài đặt được do không cài đặt ngôn ngữ. Để cài đặt ngôn ngữ, tôi phải chạy như sau:

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

Tôi đã nhận được thông tin này từ câu trả lời này trên ServerFault .

Sau khi chạy các lệnh trên như một phần của docker cung cấp gói được cài đặt mà không có bất kỳ lỗi nào. Từ .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

Tôi không thích có các biến môi trường Docker khi tôi không mong muốn người dùng hình ảnh Docker thay đổi chúng.

Chỉ cần đặt nó ở đâu đó trong một RUN. Nếu bạn không tạo các ngôn ngữ UTF-8, thì bạn có thể thực hiện nhóm lệnh sau:

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

Đây dường như là câu trả lời lành mạnh duy nhất ở đây vì nó tránh được việc vặn vít với các biến môi trường. Tuy nhiên, nó không hoạt động. localeđầu ra không được thay đổi khi thực hiện các lệnh tiếp theo, cũng như khi thực hiện các RUNkhối tiếp theo , cũng như khi xây dựng một hình ảnh khác sử dụng hình ảnh hiện tại làm cơ sở. Có lẽ một số hành động bổ sung là cần thiết để thực sự áp dụng những thay đổi này?
dùng7860670

Các lệnh trên là cách bạn tạo các vùng nếu bạn thiếu chúng. Nếu bạn muốn sử dụng chúng, bạn phải đặt nó làm biến môi trường. Hoặc, như tôi đang đề xuất trong câu trả lời này ngay bên trong RUN, hoặc, bằng cách đặt Docker ENVnhư thế nào ENV LC_ALL=en_US.UTF-8.
Mitar

-1

Thay vì đặt lại ngôn ngữ sau khi cài đặt gói cục bộ, bạn có thể trả lời các câu hỏi bạn thường được hỏi (bị vô hiệu hóa noninteractive) trước khi cài đặt gói để tập lệnh gói thiết lập ngôn ngữ chính xác, ví dụ này đặt ngôn ngữ thành tiếng Anh ( Anh, 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

Đối với tôi những gì đã làm việc trong hình ảnh 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

Tôi đã sử dụng (sau 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! 👌')"

Và nó in UTF8 works nice! 👌chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.