最近在用docker建立鏡像的時候發(fā)現(xiàn)一個問題,事情是這樣的平酿,我基于debian鏡像安裝了一系列的工具包括python3, 然后生成容器并在容器中執(zhí)行python腳本時出現(xiàn)了錯誤悦陋。錯誤信息如下
SyntaxError: Non-ASCII character '\xe8' in file main.py on line 7, but no encoding declared;
see http://python.org/dev/peps/pep-0263/ for details
如果你有興趣復(fù)現(xiàn)下面的結(jié)果,可以用docker 運(yùn)行一個debian鏡像幸逆,結(jié)果是一樣的
docker run -it --rm debian bash
第7行正好有中文暮现,也就是說程序無法處理中文。我的第一感覺就是系統(tǒng)的編碼存在問題栖袋。
首先查看系統(tǒng)使用的編碼方式塘幅。
locale
結(jié)果輸出如下
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=
使用的是POSIX字符集,POSIX字符集是不支持中文的爱沟,因此程序出現(xiàn)錯誤匆背。
再看一下系統(tǒng)自帶了哪些字符集。
locale -a
結(jié)果如下
C
C.UTF-8
POSIX
實(shí)際上linux字符集中支持中文且用的最多的應(yīng)該是zh_CN.utf8字符集括享,不過幸運(yùn)的是,C.UTF-8也是支持中文的铃辖,不然我們就必須手動安裝其他支持中文的字符集了。
將系統(tǒng)字符集改為C.UTF-8, 只要把系統(tǒng)中的環(huán)境 LANG 改為"C.UTF-8"格式就可以了仁卷,這里采用最簡單的方法犬第,修改/etc/profile 文件, 并將export LANG="C.UTF-8"加到最后一行丰介。
apt-get update && apt install vim
vim /etc/profile
# 然后將export LANG="C.UTF-8"加到最后一行
# 然后重新加載
source /etc/profile
再來看一下系統(tǒng)所用的字符集
locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
這就說明了修改成功哮幢,可以在debian中使用中文了志珍。
問題在于平時基于debian構(gòu)建鏡像時總不可能這么改得,必須在Dockerfile中指定字符集碴裙。實(shí)際上也很簡單舔株,在Dockerfile中加上一行
FROM debian
# 加上下面這一行
ENV LANG C.UTF-8
這樣生成出來的鏡像就可以使用中文了。