Docker Python设置utf-8语言环境

我试图运行我的python文件,首先读取中文string并打印出来。

这是我的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"] 

这是我的Python文件:

  # -*- coding: utf-8 -*- import jieba s = "我来到北京清华大学" s = s.decode('utf-8') print type(s), s 

然后我运行:

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)

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

当我在主pipe和gunicorn部署一个Django应用程序时遇到同样的问题。

什么修复它是添加以下行到我的主pipeconfiguration文件:

 environment=LANG="es_ES.utf8", LC_ALL="es_ES.UTF-8", LC_LANG="es_ES.UTF-8" 

为了您的情况,请确保您要打印的中文区域设置可用并已安装在泊坞窗容器中。 这个博客描述了如何做到这一点:示例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 

希望这会把你引向正确的方向。

简洁版本

把它放在你的Dockerfile

 ENV PYTHONIOENCODING=utf-8 

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

 docker run -e PYTHONIOENCODING=utf-8 my-python-image some-command 

长版本:

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

 $ python -c 'import sys; print(sys.stdout.encoding)' UTF-8 

当你运行Docker容器时,Python所期望的更高级的编码环境variables是不存在的,所以Python将回退到一个基本的字符集来确保兼容性。 您可以通过在容器中运行相同的命令来validation这一点:

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

当我们传递PYTHONIOENCODING我们看到sys.stdout.encoding被适当设置:

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

阅读Python文档中的 PYTHONIOENCODING 。 这个答案也进入了编码/解码和stdout细节 。