1、 问题描述
使用docker部署python的web服务,框架使用flask,服务部署以后进行测试,服务端报出UnicodeEncodeError
我用的python版本是3.6,按理说,对字符编码的处理已经比python2.x提升了很大一截,不应该出现这样的问题,查了一些资料,矛头指向了docker里的终端输出编码。
服务报错的地方是记录日志的代码,用的是logging模块,并没有记录到文件中,而是输出到sys.stdout中。
2、 解决过程
2.1 PYTHONIOENCODING
在Dockerfile里加入下面这句话
ENV PYTHONIOENCODING=utf-8
制作好镜像以后,启动容器时,要添加 -e PYTHONIOENCODING=utf-8
docker run -e PYTHONIOENCODING=utf-8 -d --rm -p8070:80 --name test_kg kg/flask
进入容器后,直接启动服务,python app.py 然后发送请求进行测试,这次没有再报错误
但是,当我使用uwsgi启动时,进行测试,仍然会报错,原理我说不清楚,但我猜测肯定和sys.stdout有关
2.2 sys.stdout
设置sys.stdout的编码
logger = logging.getLogger('logger')
logger.setLevel(level=logging.INFO)
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.INFO)
再次启动服务,没有再报错