从dockerhub拉取的Centos7容器底包不包含中文字符集,因此需要加装中文字符集,本文讲解如何基于centos:centos7的底包,制作启动即支持中文的镜像。
一、拉取centos:centos7的底包
[root@localhost opt] # docker pull centos:centos7
二、通过原始镜像启动容器并制作新的容器
-
从原始镜像启动容器。
[root@localhost opt]# docker run -itd --name intsrv centos:centos7
6fb2ad86f4e1ff0e40f1337a3c05a078264b8523f4b58c9bac9e0c4ad2634e33
-
进入容器,将容器内的yum源换为合适的源,因Centos7已停止支持,可以用ISO光盘作源。
[root@localhost opt]# docker exec -it intsrv /bin/bash
[root@6fb2ad86f4e1 /]# rm /etc/yum.repos.d/* -rf
[root@6fb2ad86f4e1 /]# vi /etc/yum.repos.d/http.repo
"/etc/yum.repos.d/http.repo" [New] 5L, 84C written
-
查看系统自带的字符集,可见没有中文字符集zh_CN.utf8
[root@6fb2ad86f4e1 /]# locale -a
C
POSIX
en_US.utf8
-
安装中文支持包,主要是kde-l10n-Chinese和glibc-common,网上有装fonts的方案,实测也可以,但是安装的附加包相比本方案太多了,不利于容器的轻量化。
[root@6fb2ad86f4e1 /]# yum install kde-l10n-Chinese
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
os | 3.6 kB 00:00:00
(1/2): os/group_gz | 153 kB 00:00:00
(2/2): os/primary_db | 3.3 MB 00:00:00
Resolving Dependencies
--> Running transaction check
---> Package kde-l10n-Chinese.noarch 0:4.10.5-2.el7 will be installed
--> Processing Dependency: kde-l10n = 4.10.5-2.el7 for package: kde-l10n-Chinese-4.10.5-2.el7.noarch
--> Running transaction check
---> Package kde-l10n.noarch 0:4.10.5-2.el7 will be installed
--> Processing Dependency: kde-filesystem for package: kde-l10n-4.10.5-2.el7.noarch
--> Running transaction check
---> Package kde-filesystem.x86_64 0:4-47.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
============================================================================================================================================================
Package Arch Version Repository Size
============================================================================================================================================================
Installing:
kde-l10n-Chinese noarch 4.10.5-2.el7 os 3.5 M
Installing for dependencies:
kde-filesystem x86_64 4-47.el7 os 48 k
kde-l10n noarch 4.10.5-2.el7 os 13 k
...
Installed:
kde-l10n-Chinese.noarch 0:4.10.5-2.el7
Dependency Installed:
kde-filesystem.x86_64 0:4-47.el7 kde-l10n.noarch 0:4.10.5-2.el7
Complete!
[root@6fb2ad86f4e1 /]# yum install glibc-common
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package glibc-common.x86_64 0:2.17-307.el7.1 will be updated
--> Processing Dependency: glibc-common = 2.17-307.el7.1 for package: glibc-2.17-307.el7.1.x86_64
---> Package glibc-common.x86_64 0:2.17-317.el7 will be an update
--> Running transaction check
---> Package glibc.x86_64 0:2.17-307.el7.1 will be updated
---> Package glibc.x86_64 0:2.17-317.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
============================================================================================================================================================
Package Arch Version Repository Size
============================================================================================================================================================
Updating:
glibc-common x86_64 2.17-317.el7 os 11 M
Updating for dependencies:
glibc x86_64 2.17-317.el7 os 3.6 M
...
Updated:
glibc-common.x86_64 0:2.17-317.el7
Dependency Updated:
glibc.x86_64 0:2.17-317.el7
Complete!
-
再次核查仍并没发现中文字符集,需用localedef命令编译语言环境的定义文件
[root@6fb2ad86f4e1 /]# locale -a
C
POSIX
en_US.utf8
root@6fb2ad86f4e1 /]# localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
-
继续检查,这个字符集有了
[root@6fb2ad86f4e1 /]# locale -a
C
POSIX
en_US.utf8
zh_CN.utf8
-
修改系统启动后默认使用中文字符集语言环境
网上有多种修改方法,实测以下两种在容器环境中不适用,判断应是容器启动后不会自动加载相应文件:
[root@6fb2ad86f4e1 /]# vi /etc/locale.conf
[root@6fb2ad86f4e1 /]# cat /etc/locale.conf
LANG="zh_CN.UTF-8"
[root@6fb2ad86f4e1 /]# echo 'export LANG="zh_CN.utf8"' >>/etc/profile
[root@6fb2ad86f4e1 /]# echo 'export LC_ALL="zh_CN.utf8"' >>/etc/profile
[root@6fb2ad86f4e1 /]# tail -n2 /etc/profile
export LANG="zh_CN.utf8"
export LC_ALL="zh_CN.utf8"
-
实测在容器中以下方案可行:
[root@6fb2ad86f4e1 /]# echo 'export LANG="zh_CN.utf8"' >>~/.bashrc
[root@6fb2ad86f4e1 /]# echo 'export LC_ALL="zh_CN.utf8"' >>~/.bashrc
[root@6fb2ad86f4e1 /]# tail -n2 ~/.bashrc
export LANG=zh_CN.utf8
export LC_ALL=zh_CN.utf8
-
重启容器进行测试
[root@6fb2ad86f4e1 /]# exit
exit
[root@localhost opt]# docker restart intsrv
intsrv
[root@localhost opt]# docker exec -it intsrv /bin/bash
[root@6fb2ad86f4e1 /]# locale
LANG="zh_CN.utf8"
LC_CTYPE="zh_CN.utf8"
LC_NUMERIC="zh_CN.utf8"
LC_TIME="zh_CN.utf8"
LC_COLLATE="zh_CN.utf8"
LC_MONETARY="zh_CN.utf8"
LC_MESSAGES="zh_CN.utf8"
LC_PAPER="zh_CN.utf8"
LC_NAME="zh_CN.utf8"
LC_ADDRESS="zh_CN.utf8"
LC_TELEPHONE="zh_CN.utf8"
LC_MEASUREMENT="zh_CN.utf8"
LC_IDENTIFICATION="zh_CN.utf8"
LC_ALL=zh_CN.utf8
-
此时即可通过切换输入法进行中文输入测试
[root@localhost opt]# 中文输入正常
可见当前容器对中文语言已能正常支持。
三、docker commit 提交当前容器为一个新的支持中文环境的镜像
-
提交新镜像
[root@localhost opt]# docker commit -m "centos7 with zh_CN.UTF8 20230209" -a "daijianbing" 6fb2ad86f4e1 centos-zh:V7.8.2003
-
导出镜像为本地文件便于保存和分发
[root@localhost opt]# docker save -o centos-zh-V7.8.2003.tar centos-zh:V7.8.2003
-
通过新镜像重新生成启动一个容器,测试如下,没有问题
![](https://i-blog.csdnimg.cn/blog_migrate/6cad7ebfee35accc03884043d59a765b.png)
通过制作centos7的中文支持镜像,一些老旧的代码又可以迁移到容器中正常运行了,能用就不改,是不变的真理,😄。