【问题标题】:How to set the locale inside a Debian/Ubuntu Docker container?如何在 Debian/Ubuntu Docker 容器中设置语言环境?
【发布时间】:2015-04-08 23:08:28
【问题描述】:

我正在运行一个 Ubuntu Docker 容器。我有挪威语键盘,需要使用挪威语字符 (øæå)。

我的终端字符编码设置为 UTF-8,并且我使用 SSH 连接到我的容器。但是,我无法输入挪威语字符,也无法复制和粘贴挪威语字符,也无法使用 CTL+SHIFT+U+00f8。

我试过了:

locale-gen nb_NO.UTF-8

但没有任何改变。如何在 Docker 容器中设置语言环境和键盘?

【问题讨论】:

    标签: docker ubuntu debian


    【解决方案1】:

    在你的 Dockerfile 中加入一些改编自

    # Set the locale
    RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
        locale-gen
    ENV LANG en_US.UTF-8  
    ENV LANGUAGE en_US:en  
    ENV LC_ALL en_US.UTF-8     
    

    如果你运行 Debian 或 Ubuntu,你还需要安装 locales 才能拥有 locale-gen

    apt-get -y install locales
    

    这是从关于该主题的非常好的帖子中提取的,来自

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

    【讨论】:

    • 使用Ubuntu时需要apt-get -y install locales
    • 我必须在调用locale-gen 之前添加RUN touch /usr/share/locale/locale.alias 以避免致命文件未找到错误
    • sed 脚本有点笨拙。尝试s/# \(en_US\.UTF-8 .*\)/\1/ 通过捕获它来避免在替换字符串中重复搜索短语。
    • locale-gen --no-purge en_US.UTF-8 为我工作而不是 locale.gen 文件
    • 如果你想避免创建额外的层,你可以写ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US \ LC_ALL=en_US.UTF-8
    【解决方案2】:

    使用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 
    

    这个answer对我帮助很大。

    【讨论】:

      【解决方案3】:

      只需添加

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

      进入你的 Dockerfile。 (您可能需要确保安装了locales 包。)基本操作不需要其他任何东西。 同时,在 Ubuntu 之外,locale-gen 不接受任何参数,这就是为什么使用它的“修复”都不起作用,例如在 Debian 上。 Ubuntu have patched locale-gen to accept a list of locales to generate 但目前该补丁尚未在其他任何地方的 Debian 中被接受。

      【讨论】:

      • 在 Ubuntu 映像上对我不起作用。这个answer 工作了。
      • 您能提供任何详细信息吗? C.UTF-8 在所有系统上都可用,无需安装任何东西,它应该大部分就足够了。
      • 适用于 Docker ubuntu:18.04 映像。我只需要“LANG”。我也不需要安装locales
      • 如果您只想在运行时设置它,您可以在docker run 命令参数中设置环境变量:stackoverflow.com/questions/28405902/…
      • 在 Ubuntu 上,你需要安装它们apt-get install -y locales
      【解决方案4】:

      我实际上碰巧遇到了同样的问题,但所提供的答案都不是 100% 使用 debian:latest,即使它们提供了很好的提示。

      最大的不同是你应该确保 locales locales-all 都已安装,后者已经包含 en_US.UTF- 8,因此您不必使用 local-gendpkg-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
      

      【讨论】:

      • locales-all 包的描述有: 这个包包含所有支持的语言环境的预编译语言环境数据。更好的选择是安装 locales 包并只选择所需的语言环境,但它在低内存机器上很有用,因为某些语言环境文件需要大量内存来编译。
      • E: 包 'locales-all' 没有安装候选者
      • @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:我实际上不知道 Ubuntu,因为我只在 Debian 上尝试过(请参阅我提供的 Dockerfile sn-p 中的 FROM debian:latest)。
      【解决方案5】:

      在运行命令时使用-e 指定LANGLC_ALL 环境变量:

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

      不需要修改 Dockerfile。

      【讨论】:

      • 顺便说一句,-e 参数也适用于 docker-compose。
      • 这是可行的,因为大多数发行版都包含 C.UTF-8 语言环境。它们通常不包括特定于语言的语言环境(例如en_US.UTF-8)。为此,您需要安装locales-all(大)或安装locales并在结束/etc/locale.gen后运行locale-gen
      【解决方案6】:

      提示:浏览容器文档论坛,例如 Docker Forum

      这是solution for 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
      

      【讨论】:

        【解决方案7】:

        你们不需要那些复杂的东西来设置 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。

        【讨论】:

          【解决方案8】:

          @Mixel 的 answer 非常适合我们拥有的基于 Ubuntu 的 docker 映像。

          不过,我们还有一个基于 centos 的 docker 镜像,用于通过 chef 测试食谱(使用 kitchen-docker 驱动程序)。由于未设置语言环境,我们预安装的其中一个软件包无法安装。为了安装语言环境,我必须运行以下命令:

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

          我从this answer on ServerFault得到了这个信息。

          在作为 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
          

          【讨论】:

            【解决方案9】:

            当我不希望 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 块时,也不在使用当前映像作为基础构建另一个映像时。实际应用这些更改可能需要一些额外的操作?
            • 上面的命令是您在缺少语言环境时生成语言环境的方法。如果要使用它们,则必须将其设置为环境变量。或者,正如我在这个答案中建议的那样,直接在 RUN 内部,或者通过将 Docker ENV 设置为 ENV LC_ALL=en_US.UTF-8
            【解决方案10】:

            我用过这个(在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! ?

            【讨论】:

              【解决方案11】:

              添加到“Doc​​kerfile”中:

              # Set the locale in container
              RUN apt-get -y install locales
              RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
                  locale-gen
              ENV LANG en_US.UTF-8
              ENV LANGUAGE en_US:en
              ENV LC_ALL en_US.UTF-8
              

              尽情享受吧!

              【讨论】:

                【解决方案12】:

                对于 ubuntu 14.04,/etc/locale.gen 中没有文件,但它共享文件 /etc/default/locale。所以对于可信赖的(ubuntu 14.04),只需运行

                RUN apt-get -y install locales && \
                     update-locale LANG=en_US.UTF-8
                

                这样至少全局默认区域设置从烦人的“POSIX”更改为您想要的区域设置。

                【讨论】:

                  【解决方案13】:

                  您可以在安装包之前回答通常会被问到的问题(noninteractive 禁用),而不是在安装 locales 包后重置语言环境,以便包脚本正确设置语言环境,此示例将语言环境设置为英语(英国,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/*
                  

                  【讨论】:

                    【解决方案14】:

                    对我来说,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
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-11-12
                      • 2014-05-29
                      • 2014-01-01
                      相关资源
                      最近更新 更多