डेबियन / उबंटू डॉकटर कंटेनर के अंदर लोकेल कैसे सेट करें?


124

मैं एक उबंटू डॉकटर कंटेनर चला रहा हूं। मेरे पास एक नॉर्वेजियन कीबोर्ड है और नॉर्वेजियन अक्षरों (ø )å) का उपयोग करने की आवश्यकता है।

मेरा टर्मिनल वर्ण एन्कोडिंग UTF-8 पर सेट है और मैं SSH का उपयोग करके अपने कंटेनर से जुड़ा हुआ हूं। हालाँकि, मैं नॉर्वेजियन वर्णों को टाइप करने में असमर्थ हूँ, और न ही नॉर्वेजियन वर्णों को कॉपी और पेस्ट कर सकता हूँ, और न ही CTL + SHIFT + U + 00f8 का उपयोग कर सकता हूँ।

मैंने कोशिश की:

locale-gen nb_NO.UTF-8

लेकिन कुछ भी नहीं बदला। मैं एक डॉक कंटेनर के भीतर लोकेल और कीबोर्ड कैसे सेट करूं?

जवाबों:


172

अपने डॉकरीफाइल में से कुछ अनुकूलित करें

# 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
जब आप डेबियन का उपयोग नहीं करते हैं तो इसका काम नहीं होता है: बेस कंटेनर के रूप में जेसी
iDexter

22
apt-get -y install localesजब आपको Ubuntu
user2915097

2
मुझे RUN touch /usr/share/locale/locale.aliasकॉल करने से पहले जोड़ना पड़ा locale-genताकि किसी घातक फ़ाइल से बचने के लिए त्रुटि न मिले
पॉल कीस्टर

6
sedस्क्रिप्ट अनाड़ी की तरह है। s/# \(en_US\.UTF-8 .*\)/\1/प्रतिस्थापन स्ट्रिंग में खोज वाक्यांश को दोहराने से बचने की कोशिश करें ।
ट्रिपलए

3
यदि आप अतिरिक्त परतों को बनाने से बचना चाहते हैं, तो आप लिख सकते हैंENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
आंद्रे रवाज़ी

100

डेबियन का उपयोग करने वालों को भी 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

अपने डॉकरफाइल में। (आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि localesपैकेज स्थापित है।) मूल संचालन के लिए और कुछ नहीं चाहिए। इस बीच, उबंटू के बाहर, locale-genकिसी भी तर्क को स्वीकार नहीं करता है, यही कारण है कि कोई भी 'फिक्स' इसका उपयोग नहीं करता है जैसे डेबियन पर काम करता है। उबंटू ने locale-genउत्पन्न करने के लिए स्थानों की एक सूची को स्वीकार करने के लिए पैच किया है लेकिन फिलहाल पैच को कहीं और के डेबियन में स्वीकार नहीं किया गया है।


1
एक Ubuntu छवि पर मेरे लिए काम नहीं किया। यह जवाब हालांकि काम किया।
डायलेक्स

4
क्या आप कोई विवरण दे सकते हैं? C.UTF-8कुछ भी स्थापित करने की आवश्यकता के बिना सभी प्रणालियों पर उपलब्ध है, और यह ज्यादातर पर्याप्त होना चाहिए ।
andrewsh

डॉकर ubuntu के साथ काम करता है: 18.04 छवि। मुझे केवल "लैंग" की आवश्यकता थी। मुझे localesया तो स्थापित करने की आवश्यकता नहीं थी ।
वारबीक्यू

1
यदि आप इसे केवल रनटाइम पर सेट करना चाहते हैं, तो आप docker runइसके बजाय कमांड में
arv var

1
उबंटू पर, आपको उन्हें स्थापित करने की आवश्यकता हैapt-get install -y locales
gerardnico

27

मैं वास्तव में उसी समस्या से पीड़ित हुआ, लेकिन प्रदान किए गए उत्तरों में से कोई भी 100% डेबियन के साथ काम नहीं कर रहा है: नवीनतम, भले ही वे अच्छे संकेत प्रदान करते हों।

सबसे बड़ा अंतर यह है कि आपको यह सुनिश्चित करना चाहिए कि दोनों स्थान और स्थान-सभी स्थापित हैं, बाद वाला पहले से ही en_US.UTF-8 युक्त है, इसलिए आपको इसे स्थानीय-जीन या dpkg-reconfigure के साथ उत्पन्न करने की आवश्यकता नहीं है ।

यहाँ है कि मैंने इसे बनाने के लिए अपने 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: पैकेज '
लोकेशन्स

@AstraSerg: मुझे बहुत आश्चर्य है कि आपको वह त्रुटि मिली। का ouput क्या है apt-cache show locales-all? यह निश्चित रूप से अभी भी एक आधिकारिक पैकेज है और डेबियन में उपलब्ध है।
जीन

@ जीन रूट @ शेयर: / # एप्ट-कैश शो लोकेशंस-ऑल; बिल्ली / etc / जारी एन: पैकेज 'स्थानों-सभी' से संस्करणों का चयन नहीं कर सकते क्योंकि यह पूरी तरह से आभासी एन है: कोई भी पैकेज Ubuntu 18.04.1 LTS \ n \ l नहीं मिला
AstraSerg

@AstraSerg: मैं वास्तव में उबंटू के लिए नहीं जानता क्योंकि मैंने कोशिश की थी कि डेबियन के लिए (केवल डेबियन से देखें: डॉकरीफाइल स्निपेट में नवीनतम जो मैंने प्रदान किया है)।
जीन

19

अपनी कमांड चलाते समय LANGऔर LC_ALLपर्यावरण चर का उपयोग करके निर्दिष्ट करें -e:

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

डॉकरफाइल को संशोधित करना आवश्यक नहीं है।


2
-eतर्क, भी डोकर-लिखें सुविधा के साथ काम माध्यम से।
दाग होइदहल

5
यह काम करता है क्योंकि अधिकांश डिस्ट्रोस में C.UTF-8लोकेल शामिल हैं । वे आम तौर पर भाषा-विशिष्ट स्थानों (जैसे en_US.UTF-8) को शामिल नहीं करते हैं । इसके लिए आपको ओटी इंस्‍टॉल locales-all(बड़ा) या इंस्‍टॉल करना होगा localesऔर locale-genसमाप्‍त होने के बाद चलाना होगा /etc/locale.gen
जोनाथन रेनहार्ट

5

युक्ति: कंटेनर दस्तावेज़ फ़ोरम ब्राउज़ करें, जैसे Docker फ़ोरम

यहाँ डेबियन और 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

आप लोगों को उबंटू / डेबियन पर स्थान निर्धारित करने के लिए उन जटिल चीजों की आवश्यकता नहीं है। आपको /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

@ मिसेल का जवाब हमारे पास मौजूद उबंटू आधारित डॉकटर छवि के लिए बहुत अच्छा है।

हालांकि, हमारे पास शेफ ( kitchen-dockerड्राइवर का उपयोग करके ) के माध्यम से व्यंजनों का परीक्षण करने के लिए एक सेंटोस आधारित डॉकटर छवि भी है । हमारे द्वारा पहले से इंस्टॉल किए गए पैकेजों में से कोई भी लोकेल सेट नहीं होने के कारण इंस्टॉल करने में विफल रहा था। एक स्‍थापना स्‍थापित करने के लिए, मुझे निम्‍नलिखित को चलाना होगा:

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

मुझे सर्वरफॉल्ट पर इस जवाब से यह जानकारी मिली ।

उपरोक्त आदेशों को चलाने के बाद बिना किसी त्रुटि के स्थापित पैकेज का प्रावधान करने वाले docker के हिस्से के रूप में। से .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

जब मैं उन्हें बदलने के लिए डॉकर छवि के उपयोगकर्ता की उम्मीद नहीं करता हूं तो मुझे डॉकर पर्यावरण चर पसंद नहीं है।

बस इसे कहीं एक में रख दो 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 के अंदर, या, ENVजैसे Docker को सेट करके प्रस्तावित कर रहा हूं ENV LC_ALL=en_US.UTF-8
मेराज

-1

लोकेशन पैकेज की स्थापना के बाद लोकेल को रीसेट करने के बजाय आप उन सवालों के जवाब दे सकते हैं जो आप सामान्य रूप noninteractiveसे पैकेज स्थापित करने से पहले पूछेंगे (जो कि अक्षम है ) ताकि पैकेज स्क्रिप्ट स्थानीय रूप से सही तरीके से सेटअप हो जाए, यह उदाहरण लोकेल को अंग्रेजी में सेट करता है ( ब्रिटिश, यूटीएफ -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

मेरे लिए 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

मैंने इसका इस्तेमाल किया (बाद में 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! 👌सही ढंग से प्रिंट करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.