我正在尝试运行我的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"]
这是我的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)
当我在本地运行时,它运行正常。
答案 0 :(得分:13)
我在使用主管和gunicorn部署Django应用程序时遇到了同样的问题。
将以下行添加到我的超级用户配置文件中的原因是什么:
environment=LANG="es_ES.utf8", LC_ALL="es_ES.UTF-8", LC_LANG="es_ES.UTF-8"
对于您的情况,请确保您要打印的中文区域设置可用并安装在docker容器中。这个blog描述了如何做到这一点: 示例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
希望这会引导你走向正确的方向。
答案 1 :(得分:12)
将其放入Dockerfile
:
ENV PYTHONIOENCODING=utf-8
或如上面评论中所述,在命令行上传递它:
docker run -e PYTHONIOENCODING=utf-8 my-python-image some-command
当您启动Python解释器时,Python必须设置stdout
才能将输出发送到您的终端。在您的现代操作系统上,您的终端可能会报告它支持UTF-8或其他一些高级编码。您可以通过运行此命令来查看使用的编码:
$ python -c 'import sys; print(sys.stdout.encoding)'
UTF-8
当您运行docker容器时,Python不希望使用更高级编码的环境变量,因此Python将回退到基本字符集以确保兼容性。您可以通过在容器中运行相同的命令来验证这一点:
$ 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
了解the Python documentation中的PYTHONIOENCODING
。 This answer also goes into great detail about encoding/decoding and stdout
答案 2 :(得分:1)
我在docker文件中添加以下命令:
RUN locale-gen en_US.UTF-8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
然后构建/重建docker图像,您最好在基本图像中添加它。
答案 3 :(得分:0)
RUN set -e \
&& locale-gen en_CA en_CA.UTF-8 \
&& update-locale LC_ALL=en_CA.UTF-8 LANG=en_CA.UTF-8