任务背景
因公司业务要求,需要将目前公司内k8s部署的java应用的基础镜像又linux的alpine版本替换为银河麒麟系统,即kylinv10。
前置准备
已从公开渠道获取了精简版镜像
kylin10-x86-sp2-flat-jdk342-limited
部署JAVA服务
将原有项目中DockerFile内的基础镜像替换
FROM XXXX 替换为麒麟基础镜像
问题产生
服务启动后,通过kubectl logs打印的日志中发现中文字符都变成了问号?
通过信息检索获取到了初步的解决方案:
通过在DockerFile中指定环境变量设置字符集编码
ENV LANG=zh_CN.UTF-8
ENV LC_ALL=zh_CN.UTF-8
尝试重新部署服务后发现乱码并未解决
通过命令行进入容器检查字符集是否生效
locale
发现字符集仍使用的是默认字符集
检查当前镜像是否支持的字符集列表
locale -a
当前容器不支持zh_CN.UTF-8
解决方案
通过相同版本的麒麟镜像获取对应的字符集包,对精简版镜像进行二次封装
首先准备完整版麒麟镜像。
链接:https://pan.baidu.com/s/1EngzxiChf95MpUL6o-9jnw
提取码:xekt
通过虚拟机安装镜像
进入终端中修改网卡配置
cd /etc/sysconfig/network-scripts
在初始状态下,当前目录中只存在ifcfg-lo这个回环网卡
需要更换为自己的网卡信息
vi ifcfg-ens33
需要注意IPADDR、GATEWAY、DNS 需要根据当前网络状况配置
网卡信息修改完成后状态如下
重启网卡并关闭防火墙
service network restart
systemctl stop firewalld
systemctl disable firewalld
重启网卡完成后检查当前虚拟机网络状态
当网络正常连接后
通过ftp工具获取到对应的编码包文件
/usr/lib/locale/zh_CN.utf8
/usr/share/locale/zh_CN
在装有docker的机器上启动精简版镜像
导入本地docker镜像
将镜像包导入
docker load -i kylin10-x86-sp2-flat-jdk342-limited-20221209.tar
基础容器无主进程启动
docker run -d -it imagename bash
将字符集文件放入镜像中
docker cp zh_CN.utf8 containerId:/usr/lib/locale
docker cp zh_CN containerId:/usr/share/locale/zh_CN
通过命令行进入容器,并进入对应位置检查cp的文件是否存在
docker exec -it containerId bash
修改环境变量并设置字符集,在末位添加内容
vim /etc/profile
#加入内容
export LANG=zh_CN.UTF-8
#生效配置
source /etc/profile
#加入重启自动生效,文末加入如下内容
vim /root/.bashrc
#末尾加入内容
source /etc/profile
再次检查可用字符集,已经装配了zh_CN.utf8
将二次改造的容器重新打包为镜像
docker commit [containerId] imageName:version
将镜像打包为压缩文件
docker load -i kylin10-x86-sp2-flat-jdk342-zh-limited.tar
将镜像推送到镜像仓库
docker tag [old] [new]
将镜像推送到镜像仓库中
docker push harbor.docker.io/kylin10-x86-sp2-flat:jdk342-zh-limited
再次将java服务中的基础镜像替换为封装的kylin即可。