美文网首页
Docker下不支持中文解决办法-已验证有效

Docker下不支持中文解决办法-已验证有效

作者: 箛獨劍 | 来源:发表于2018-07-17 18:07 被阅读0次

    一、起因和验证

    由于在项目中使用了Docker的mysql容器,需要到docker里面去做增量的sql更新。结果发现更新后的中文都丢失了。怀疑是docker容器内承载的系统不支持中文.
    所以,通过宿主机进入docker的bash环境后,连接mysql,执行sql语句。再次验证;

    现象如图所示:

    +-----+-----------+----------+--------+------------+
    | id  | name      | value    | dic_id | is_default |
    +-----+-----------+----------+--------+------------+
    |   1 | ???       | 1        |      1 | 1          |
    |   2 | ???       | 2        |      1 | 1          |
    |   3 | ???       | 3        |      1 | 1          |
    |   4 | ??        | 1        |      2 | 1          |
    

    进入Docker内部,执行sql语句现象:

    [root@vm172-31-32-3 ~]# docker exec -it mysql2 bash
    root@9929c772da63:/# mysql -u root -p
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> use test;
    Database changed
    
    ##下一行是原文:
    mysql> insert into user(id,username) values('1','张三');
    ##变成了:
    mysql> insert into user(id,username) values('1','');
    
    

    二、查找原因

    2.1 查看系统及系统所支持字符集

    A、使用 cat /etc/issue 命令查看承载系统

    root@9929c772da63:/# cat  /etc/issue
    Debian GNU/Linux 9 \n \l
    
    

    B、使用locale查看linux正在使用的编码方式

    root@9929c772da63:/# 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=
    
    

    C、查看Linux支持的编码方式

    root@9929c772da63:/# locale -a
    C
    C.UTF-8
    POSIX
    root@9929c772da63:/# 
    
    

    三、原因及解决方案

    3.1 原因及无法生效的解决方案

    首先,目前网上搜了下,出现这个问题的以Debian系统居多,网上有的方法是直接在命令行下输入命令,然后重新加载系统变量,不过笔者发现并未改变系统编码;

    ##注:此方案笔者测试未生效
    root@9929c772da63:/# LANG=C.UTF-8  (有的是zh_CN.UTF-8,不过我在本地没发现这种编码)
    root@9929c772da63:/# source /etc/profile
    

    3.2 解决方案一

    此方案参考了peakhell的文章 《解决docker中的容器无法使用中文的问题》
    https://www.jianshu.com/p/6fe582ba6d3d

    使用vim编辑 /etc/profile 将“export LANG="C.UTF-8”命令添加在profile最后
    但是Debian内没有vim以及vi工具可以有2种方法
    注意:这2方法都是临时改变编码,一旦从容器中退出,然后再进去,编码集还原,需要再次使用 source /etc/profile再次刷新才可

    3.2.1将文件从docker容器内拷贝出,然后再宿主机上修正后,再拷贝回去

    #将容器内/etc/profile文件拷贝到宿主机/app/backup目录下
    [root@vm8-80-8-8 sql]# docker cp mysql2:/etc/profile /app/backup
    [root@vm8-80-8-8 sql]# vim /app/backup/profile
    
    
    #追加命令-在最后一行,然后保存
    # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
    # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
    # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
    ....忽略N行
    if [ -d /etc/profile.d ]; then
      for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
          . $i
        fi
      done
      unset i
    fi
    
    export LANG="C.UTF-8"
    
    
    
    

    最后将文件拷贝回容器内,刷新系统变量

    [root@vm8-80-8-8 sql]# docker cp /app/backup/profile mysql2:/etc/profile
    [root@vm8-80-8-8 sql]# docker exec -it mysql2 bash
    root@9929c772da63:/# source /etc/profile
    

    检查结果

    root@9929c772da63:/# 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=
    
    

    3.2.2直接在容器内安装vim工具,直接编辑

    首先,更换apt-get源,然后再docker容器内安装vim

    mv /etc/apt/sources.list /etc/apt/sources.list.bak
    echo "deb http://mirrors.163.com/debian/ jessie main non-frcontrib" >/etc/apt/sources.list
    echo "deb http://mirrors.163.com/debian/ jessie-proposed-updatmain non-free contrib" >>/etc/apt/sources.list
    echo "deb-src http://mirrors.163.com/debian/ jessie main non-frcontrib" >>/etc/apt/sources.list
    echo "deb-src http://mirrors.163.com/debiajessie-proposed-updates main non-free contri>>/etc/apt/sources.list
    #更新安装源
    apt-get update
    apt-get install -y vim  
    

    后续操作,如3.1.1所示,不在赘述;

    3.2 直接在Docker建立是指定字符集(暂时未验证)

    参考:

    《Docker下终端无法输入中文问题》
    https://blog.csdn.net/wen3qin/article/details/78386654

    在纯docker环境中

    docker run -it mysql env LANG=C.UTF-8 /bin/bash
    

    在K8S环境中

    //启动 
    kubectl run -it –rm –image=mysql mysql-client – env LANG=C.UTF-8 /bin/bash
    
    //进入pod 
    kubectl exec -ti mysql-client – env LANG=C.UTF-8 /bin/bash
    

    相关文章

      网友评论

          本文标题:Docker下不支持中文解决办法-已验证有效

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