问题是这样的,在使用docker制作odoo 8 某个特定的版本的时候,突然冒出了这个提示:1
UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128)
因为odoo 8使用的还是python2.7的版本,这个问题基本是老生常谈的问题,心想这还不简单,一顿骚操作:
手写了一个sitecustomize.py,设置python的encoding为utf8,放到Dockerfile的文件夹下,Dockerfile里加一句COPY到python的路径中,搞定。
自信满满的重新构建了镜像,然后开启容器,打开浏览器准备访问,发现没反应。什么鬼,难道又挂了?
docker logs一看,果然,又挂了,可是为什么还是上面那个错?
问题的排查
不信这个邪了,首先怀疑的是sitecustomize.py文件没有起作用。exec进容器,然后打开一个python terminal,
sys.getdefaultencoding()看了一下:1
2
3import sys
sys.getdefaultencoding()
utf8
这就说明python的encoding设置正确了,*他大爷的,那问题会出现在哪呢?
我把自定义的addons删掉,重启,一切正常。
难道是python不能输出中文?
写个脚本,上传到容器中:1
2
3print u'中文'
中文
也正常运行了,那到底是为啥呢?
没办法,只好又看一了下错误日志,在报错的地方加了一句输出,重启。
在输出的日志中,看到了这么一行:1
2
3...
/home/.../行政区域.xlsx
...
原来是因为路径中存在中文导致的报错,可是python为啥读不了中文呢?
这时候我突然想起来,该镜像是从官方的ubuntu制作而来,既然是官方,自然默认的语言设置就是英文了。
马上看一下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
果然不是utf-8!
问题终于找到了,解决方案也非常简单,在Dockerfile中加一句:1
ENV LANG C.UTF-8
你看,本来一位非常简单的问题,却饶了这么一个大弯~~