美文网首页程序员
解决docker中的容器无法使用中文的问题

解决docker中的容器无法使用中文的问题

作者: peakhell | 来源:发表于2018-06-07 16:32 被阅读1052次

    最近在用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
    

    这样生成出来的镜像就可以使用中文了。

    相关文章

      网友评论

        本文标题:解决docker中的容器无法使用中文的问题

        本文链接:https://www.haomeiwen.com/subject/qlmgsftx.html