Docker Python设置了utf-8语言环境

jxn*_*jxn 9 python utf-8 docker

我正在尝试运行我的python文件,该文件首先读取中文字符串并打印出来.

这是我的Dockerfile

FROM python:2.7-onbuild
ENV LANG en_US.UTF-8
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
Run Code Online (Sandbox Code Playgroud)

这是我的python文件:

    # -*- coding: utf-8 -*-
    import jieba
    s = "?????????"
    s = s.decode('utf-8')
    print type(s), s
Run Code Online (Sandbox Code Playgroud)

然后我跑:

docker build -t python-example .

docker run python-example

我得到的错误: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)

当我在本地运行它,它工作正常.

aar*_*fay 16

精简版

把它放在你的Dockerfile:

ENV PYTHONIOENCODING=utf-8
Run Code Online (Sandbox Code Playgroud)

或者如上面的评论中提到的那样在命令行上传递它:

docker run -e PYTHONIOENCODING=utf-8 my-python-image some-command
Run Code Online (Sandbox Code Playgroud)

长版:

当您启动Python解释器时,必须设置Python stdout才能将输出发送到您的终端.在您的现代操作系统上,您的终端可能会报告它支持UTF-8或其他一些高级编码.您可以通过运行此命令查看使用的编码:

$ python -c 'import sys; print(sys.stdout.encoding)'
UTF-8
Run Code Online (Sandbox Code Playgroud)

当您运行docker容器时,Python不希望使用更高级编码的环境变量,因此Python将回退到基本字符集以确保兼容性.您可以通过在容器中运行相同的命令来验证这一点:

$ docker run my-python-image python -c 'import sys; print(sys.stdout.encoding)'
ANSI_X3.4-1968
Run Code Online (Sandbox Code Playgroud)

当我们通过时,PYTHONIOENCODING我们看到sys.stdout.encoding正确设置:

$ docker run -e PYTHONIOENCODING=UTF-8 my-python-image python -c 'import sys; print(sys.stdout.encoding)'
UTF-8
Run Code Online (Sandbox Code Playgroud)

阅读关于PYTHONIOENCODINGPython文档.这个答案也详细介绍了编码/解码和stdout.

  • 在 Ubuntu Bionic 上,这仅在首先安装“locales”包时有效。 (2认同)

mat*_*yas 14

我在使用主管和gunicorn部署Django应用程序时遇到了同样的问题.

是什么修复了将以下行添加到我的超级用户配置文件中:

environment=LANG="es_ES.utf8", LC_ALL="es_ES.UTF-8", LC_LANG="es_ES.UTF-8"
Run Code Online (Sandbox Code Playgroud)

对于您的情况,请确保您要打印的中文区域设置可用并安装在docker容器中.此博客描述了如何执行此操作:示例dockerfile(使用中文语言环境而不是en_CA.UTF-8):

FROM ubuntu:15.10
MAINTAINER Mobify <ops@mobify.com>

RUN apt-get -qq update && \
    apt-get -q -y upgrade && \
    apt-get install -y sudo curl wget locales && \
    rm -rf /var/lib/apt/lists/*

# Ensure that we always use UTF-8 and with Canadian English locale
RUN locale-gen en_CA.UTF-8

COPY ./default_locale /etc/default/locale
RUN chmod 0755 /etc/default/locale

ENV LC_ALL=en_CA.UTF-8
ENV LANG=en_CA.UTF-8
ENV LANGUAGE=en_CA.UTF-8
Run Code Online (Sandbox Code Playgroud)

希望这能引导你走向正确的方向.

  • 根据这个github问题跟踪器:https://github.com/docker-library/python/issues/69你也可以试试这个:docker run -e PYTHONIOENCODING = utf-8这样做有用吗? (2认同)