解決docker中的容器無法使用中文的問題

最近在用docker建立鏡像的時候發現一個問題,事情是這樣的,我基於debian鏡像安裝了一系列的工具包括python3, 然後生成容器並在容器中執行python腳本時出現了錯誤。錯誤信息如下

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

如果你有興趣復現下面的結果,可以用docker 運行一個debian鏡像,結果是一樣的

docker run -it --rm debian bash

第7行正好有中文,也就是說程序無法處理中文。我的第一感覺就是系統的編碼存在問題。
首先查看系統使用的編碼方式。

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=

使用的是POSIX字符集,POSIX字符集是不支持中文的,因此程序出現錯誤。
再看一下系統自帶了哪些字符集。

locale -a

結果如下

C
C.UTF-8
POSIX

實際上linux字符集中支持中文且用的最多的應該是zh_CN.utf8字符集,不過幸運的是,C.UTF-8也是支持中文的,不然我們就必須手動安裝其他支持中文的字符集了。
將系統字符集改爲C.UTF-8, 只要把系統中的環境 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

再來看一下系統所用的字符集

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構建鏡像時總不可能這麼改得,必須在Dockerfile中指定字符集。實際上也很簡單,在Dockerfile中加上一行

FROM debian
# 加上下面這一行
ENV LANG C.UTF-8

這樣生成出來的鏡像就可以使用中文了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章