docker镜像中文乱码,内网中文乱码解决,docker镜像导入导出,docker镜像centos 中文乱码
之前部署的服务发现log打印出来,包括生成的文件打开都是显示中文乱码,但是在控制台看是正常的,我们用的openshift,一直没解决,今天抽时间解决了,来记录一下,docker我用的不是很熟,凑活解决了。
我们项目是部署在内网的,用到打包的centos镜像,jdk镜像是centos镜像打包来的,我们的服务用到的是jdk镜像生成的,一环套一环,最后解决就是,将centos镜像里安装中文包,操作如下:
先将centos镜像生成tar包
docker save 镜像id > /root/centos-0716.tar
拷贝到有外网的机器上,导成镜像
docker load < /root/centos-0716.tar
docker save和load是将内网的镜像完全拷贝出来,镜像的id和版本号都是一致的。
然后启动镜像
docker run -it centos:V1.0 /bin/bash
启动镜像以后会直接进入到镜像,可以看一下现在的镜像里面是没有中文包的
命令:locale -a
然后我们需要下载中文包:
操作如下:
1、yum install kde-l10n-Chinese -y 安装语言包(针对centos 7)
2、yum reinstall glibc-common -y 更新gitbc 包(因为该镜像已阉割了该包的部分功能,所以需要更新)
3、localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 (设置系统语言包)
第二个步骤我这边执行错误,所以我只执行了1,3
然后就可以看到有中文包了
然后退出容器,重新将这个容器打一个tar包
查看容器的信息:docker ps -a
可以看到容器的名字
将容器打成一个tar包:
docker export -o centos-utf.tar centos-utf8
其中-o表示输出到文件,centos-utf.tar为目标文件,centos-utf8是源容器名(name)docker ps -a可以看到
然后将打好的tar传到内网,将tar转成centos镜像就可以了
docker import centos-utf.tar centos:latest
docker import 解成的镜像,镜像id和名字版本都是可以自己设置的,不像load,是用的原来的。
至此结束,然后重新打包jdk,用最新的centos镜像就可以了。
还需要在Dockerfile中设置:
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
ENV LC_ALL zh_CN.UTF-8
加上这两个就可以了,启动的项目中的中文就是正常的了。
拓展:
export命令导出的tar文件略小于save命令导出的
export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出
基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。如下图所示,nginx:latest是save导出load导入的,nginx:imp是export导出import导入的。
建议
可以依据具体使用场景来选择命令
若是只想备份images,使用save、load即可
若是在启动容器后,容器内容有变化,需要备份,则使用export、import
引用文档地址:
https://blog.****.net/hnmpf/article/details/81478972?utm_source=blogxgwz8