จะตั้งค่าภาษาภายในคอนเทนเนอร์ Debian / Ubuntu Docker ได้อย่างไร


124

ฉันใช้งานคอนเทนเนอร์ Ubuntu Docker ฉันมีแป้นพิมพ์ภาษานอร์เวย์และจำเป็นต้องใช้อักขระภาษานอร์เวย์ (øæå)

การเข้ารหัสอักขระ Terminal ของฉันถูกตั้งค่าเป็น UTF-8 และฉันเชื่อมต่อกับคอนเทนเนอร์ของฉันโดยใช้ SSH อย่างไรก็ตามฉันไม่สามารถพิมพ์อักขระภาษานอร์เวย์หรือคัดลอกและวางอักขระนอร์เวย์หรือใช้ CTL + SHIFT + U + 00f8

ฉันเหนื่อย:

locale-gen nb_NO.UTF-8

แต่ไม่มีอะไรเปลี่ยนแปลง ฉันจะตั้งค่าภาษาและคีย์บอร์ดภายในคอนเทนเนอร์ Docker ได้อย่างไร

คำตอบ:


174

ใส่ 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

22
คุณจำเป็นต้องapt-get -y install localesใช้เมื่อใช้ Ubuntu
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

4
คุณช่วยให้รายละเอียดได้หรือไม่? C.UTF-8มีอยู่ในทุกระบบโดยไม่จำเป็นต้องติดตั้งอะไรเลยและส่วนใหญ่ควรเพียงพอ
andrewsh

ทำงานร่วมกับ Docker ubuntu: ภาพ 18.04 ฉันต้องการแค่ "LANG" ฉันไม่จำเป็นต้องติดตั้งlocalesอย่างใดอย่างหนึ่ง
wisbucky

1
หากคุณต้องการตั้งค่านี้ที่รันไทม์เท่านั้นคุณสามารถตั้งค่า env vars ในdocker runargs คำสั่งแทน: stackoverflow.com/questions/28405902/…
wisbucky

1
บน Ubuntu คุณต้องติดตั้งapt-get install -y locales
gerardnico

27

ฉันเคยประสบปัญหาเดียวกัน แต่ไม่มีคำตอบใดที่ใช้งานได้ 100% กับ debian: ล่าสุดแม้ว่าจะให้คำแนะนำที่ดีก็ตาม

ความแตกต่างที่ยิ่งใหญ่ที่สุดคือการที่คุณควรตรวจสอบให้แน่ใจว่าทั้งสถานที่ และ สถานที่ทั้งหมดมีการติดตั้งหลังแล้วมี en_US.UTF-8 ดังนั้นคุณจึงไม่จำเป็นต้องสร้างมันด้วยท้องถิ่น Genหรือdpkg-กำหนดค่า

นี่คือสิ่งที่ฉันได้ทำใน 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
คำอธิบายของแพ็กเกจโลแคลทั้งหมดมี: แพ็กเกจนี้มีข้อมูลโลแคลที่คอมไพล์ไว้ล่วงหน้าสำหรับโลแคลที่รองรับทั้งหมด ทางเลือกที่ดีกว่าคือการติดตั้งแพ็กเกจโลแคลและเลือกเฉพาะโลแคลที่ต้องการ แต่อาจมีประโยชน์กับเครื่องที่มีหน่วยความจำต่ำเนื่องจากไฟล์โลแคลบางไฟล์ใช้หน่วยความจำในการคอมไพล์มาก
user2707671

E: Package 'locales-all' ไม่มีตัวเลือกการติดตั้ง
AstraSerg

@AstraSerg: ฉันแปลกใจมากที่คุณได้รับข้อผิดพลาดนั้น เอาท์พุทของapt-cache show locales-allอะไร? ยังคงเป็นแพ็คเกจอย่างเป็นทางการและมีให้บริการใน Debian
ฌอง

@Jean root @ share: / # apt-cache show locales-all; cat / etc / issue N: ไม่สามารถเลือกเวอร์ชันจากแพ็กเกจ 'locales-all' ได้เนื่องจากเป็นเสมือนจริง N: ไม่พบแพ็คเกจ Ubuntu 18.04.1 LTS \ n \ l
AstraSerg

@AstraSerg: จริง ๆ แล้วฉันไม่รู้ว่า Ubuntu เพราะฉันลองใช้กับ Debian เท่านั้น (ดูจาก debian: ล่าสุดในข้อมูลโค้ด Dockerfile ที่ฉันให้ไว้)
ฌอง

19

ระบุตัวแปรLANGและLC_ALLสภาพแวดล้อมที่ใช้-eเมื่อรันคำสั่งของคุณ:

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

ไม่จำเป็นต้องแก้ไข Dockerfile


2
-eข้อโต้แย้งทำงานร่วมกับนักเทียบท่า-เขียนยังโดยวิธีการ
Dag Høidahl

5
สิ่งนี้ได้ผลเนื่องจาก distros ส่วนใหญ่มีC.UTF-8โลแคล โดยปกติแล้วจะไม่รวมโลแคลเฉพาะภาษา (เช่นen_US.UTF-8) สำหรับสิ่งที่คุณจำเป็นต้องติดตั้ง OT locales-all(ใหญ่) หรือติดตั้งlocalesและเรียกใช้หลังจากสิ้นสุดlocale-gen /etc/locale.gen
Jonathon Reinhart

5

เคล็ดลับ: เลือกดูฟอรั่มเอกสารภาชนะเช่นหางฟอรั่ม

นี่เป็นวิธีแก้ปัญหาสำหรับ debian & ubuntuเพิ่มสิ่งต่อไปนี้ใน 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

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 ที่เรามี

อย่างไรก็ตามเรายังมีภาพนักเทียบท่าที่ใช้ centos สำหรับการทดสอบสูตรอาหารผ่านทางเชฟ (โดยใช้kitchen-dockerไดรเวอร์) หนึ่งในแพ็คเกจที่เราติดตั้งล่วงหน้าล้มเหลวในการติดตั้งเนื่องจากไม่มีการตั้งค่าโลแคล ในการติดตั้งโลแคลฉันต้องเรียกใช้สิ่งต่อไปนี้:

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

ฉันได้ข้อมูลนี้จากคำตอบนี้ใน ServerFaultServerFault

หลังจากเรียกใช้คำสั่งข้างต้นซึ่งเป็นส่วนหนึ่งของการจัดเตรียมนักเทียบท่าแพ็คเกจที่ติดตั้งโดยไม่มีข้อผิดพลาดใด ๆ จาก.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 เปลี่ยนแปลง

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

คำสั่งข้างต้นเป็นวิธีสร้างโลแคลหากคุณไม่มีคำสั่งเหล่านี้ หากคุณต้องการใช้คุณต้องตั้งค่าเป็นตัวแปรสภาพแวดล้อม หรือตามที่ฉันเสนอในคำตอบนี้โดยตรงภายใน RUN หรือโดยการตั้งค่า Docker ENVเช่น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

สำหรับฉันสิ่งที่ทำงานในอิมเมจอูบุนตู :

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.