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

一、起因和验证

由于在项目中使用了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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,530评论 15 147
  • 栖水逢开月,涸辙枉行舟。 三两故情尽,徒留一身秋。 四海天涯阔,万里容几何。 欲乘黄鹤去,不忍望九州。
    于子夜阅读 85评论 0 1
  • 教育与批评孩子最好在家中。一家人可以在一周选择一个时间坐在一起,开诚布公地交流。父母可以借此机会提出对孩子的要求,...
    康暖阅读 287评论 0 1
  • 一班从起始站到终点站的列车。目送了不同站点下车的人,有站票,有坐票,他们下车时松了一口气,为短暂却难受的旅程,为列...
    赤耳小乐阅读 240评论 1 0
  • 由于苹果和谷歌AR追踪技术已经掌握在数以百万计的开发者和用户手中,市场对此产生了大量的关注和报道,而你可能会认为我...
    壹米玖坤阅读 538评论 0 0