docker中的中文路径问题

问题是这样的,在使用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
3
import sys
sys.getdefaultencoding()
utf8

这就说明python的encoding设置正确了,*他大爷的,那问题会出现在哪呢?

我把自定义的addons删掉,重启,一切正常。

难道是python不能输出中文?
写个脚本,上传到容器中:

1
2
3
print u'中文'
中文

也正常运行了,那到底是为啥呢?

没办法,只好又看一了下错误日志,在报错的地方加了一句输出,重启。
在输出的日志中,看到了这么一行:

1
2
3
...
/home/.../行政区域.xlsx
...

原来是因为路径中存在中文导致的报错,可是python为啥读不了中文呢?
这时候我突然想起来,该镜像是从官方的ubuntu制作而来,既然是官方,自然默认的语言设置就是英文了。
马上看一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
locale
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

你看,本来一位非常简单的问题,却饶了这么一个大弯~~