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

docker镜像中文乱码,内网中文乱码解决,docker镜像导入导出,docker镜像centos 中文乱码

然后我们需要下载中文包:

操作如下:

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

然后就可以看到有中文包了

docker镜像中文乱码,内网中文乱码解决,docker镜像导入导出,docker镜像centos 中文乱码

然后退出容器,重新将这个容器打一个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

https://blog.****.net/ncdx111/article/details/79878098