Docker容器不识别宋体等字体的解决方案

问题背景:

在使用docker部署项目的时候,由于项目中调用打印控件默认使用的是系统字体,在windows上部署没有问题,但是在docker容器中运行的时候,由于docker中没有宋体等相关字体,导致系统报错无法找到相应的字体。

解决思路:

其实就像解决linux本身没有宋体的问题一样,也可以用来解决容器问题。发现其实很多docker容器的问题最后都可以仿照linux的解决思路来处理。大体就是下载宋体ttf、ttc文件,然后将其考入容器字体目录下,重启容器即可。

解决办法:

1、查看容器支持的字体。

fc-list :lang=zh

当看到下列情况,说明没有安装字体管理,需要安装字体

2、安装字体库。

yum -y install fontconfig

安装完成后,在/usr/share目录下就能看到fontconfig、fonts文件夹,如图:

3、将下载下来的字体ttc、ttf文件拷贝到容器的/usr/share/fonts文件中。

cp simsun.ttc 容器:/usr/share/fonts
cp simsun.ttf 容器:/usr/share/fonts

4、然后重启容器,就可以看到安装的中文字体。

5、也可以将此步骤写到Dockerfile中,在构建镜像的时候自动实现。

补充:Docker | Docker容器中安装中文字体 和 更改 utf-8 编码(解决中文乱码问题)

1. 项目背景

开发团队反馈,在项目运行中,使用 pagoffice 和 使用 word 转 pdf 会出现乱码,针对这一问题,进行解决,做此记录,用以回顾。

2. 问题分析

使用 pagoffice 和 使用 word 转 pdf 出现乱码有两个问题,对应关系为:

pagoffice ---- 未使用 UTF-8 编码,部分 docker 容器中默认为 POSIX。

word2pdf ---- Liunx 中未安装中文字体缺失,linux及docker容器中默有部分中文,或无中文字体。

综上所述,要想彻底解决容器乱码问题,则需要解决:1.使用 utf-8 ,支持中文; 2.安装中文字体。

3. 解决方案

3.1. 使用 UTF-8 编码,支持中文

3.1.1 使用C.UTF-8编码

使用C.UTF-8编码能够支持中文的,官网上的docker镜像是支持并默认是C.UTF-8编码。

locale -a
#查看容器所有语言环境
locale
#查看容器使用的语言环境

如果使用的镜像不是C.UTF-8编码,则可以更改为此编码格式,在运行容器时添加以下参数:

-e export LANG="C.UTF-8"

3.1.2 其他方案

也可以在 docker 启动的时候,加上参数。

-e export LANG="zh_CN.UTF-8"

但是我使用的是docker官网的镜像,使用参数后,确实是设置使用了"zh_CN.UTF-8",但是没有进行安装。会有报错:

locale
#查看设置的字符集
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=zh_CN.UTF-8

LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
locale -a
#查看安装的字符集
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
POSIX
en_US.utf8

3.2. 安装中文字体,显示中文

3.2.1 查看现有字体

查看Linux目前的所有字体

fc-list

查看Linux目前的所有中文字体

fc-list :lang=zh

3.2.2 获取其他字体

在 windows 系统中,字体存在于 C:\Windows\Fonts 下。复制后,打上传到 Linux 服务器 /opt/software/chinese 中(我是要在docker容器中安装字体,如果要在linux主机中安装字体,则直接放在服务器的 /usr/share/fonts/ 文件夹下)。

3.2.2 容器安装字体

docker ps -a
#查看容器
docker cp /opt/software/chinese tomcat:/usr/share/fonts/
#tomcat为容器名称
docker exec -it tomcat /bin/bash
#进入容器

chmod 644 -R chinese/
授权文件夹
fc-list :lang=zh
#查看中文字体

fc-cache -fv
#刷新缓存

3.3. 验证

pagoffice ---- 改动docker 容器后,需要重启容器

word2pdf ---- 刷新字体缓存即可,不需要重启容器

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 解决docker run后容器出现Exited (0)情况的问题

    自己做了个centos7的openresty的Dockerfile,build之后 docker run -d -p 801:80 openresty:1.19 /usr/local/openresty/nginx/sbin/nginx 之后docker ps -a出现如下情况 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9dee2d04b3b5 openresty:1.19 "/usr/local/openrest-"

  • docker run -v 挂载数据卷异常,容器状态一直是restarting的解决

    出现的问题: docker run 加上 -v 参数之后,容器就一直是 restarting 状态,去掉 -v 参数就可以正常运行 查找问题: 使用 docker logs 'containerId' 这个containerId,就是docker run之后返回的containerId 可以看到,是权限拒绝的问题 解决问题: docker run时加上参数 :加上--privileged=true 例如: docker run -dit -e MYSQL_ROOT_PASSWORD=123456

  • Docker 实现容器端口绑定本地端口

    今天遇到启动镜像之后,通过HTTP请求的的方式访问不了的一个小问题,下面来记录并分享下解决办法: 常用的docker启动命令和解决办法如下所示: 一.启动docker 众所周知,启动容器的命令如下: docker run 镜像名称 二.绑定容器端口与本地端口 由于启动容器之后,本地无法直接访问容器内的端口,故而需要将本地的端口与容器的端口做一个绑定操作,从而可以通过本地端口去访问容器,设置如下: docker run -p 本地端口:容器端口 镜像名称 然后就可以通过本地的浏览器通过本地的端口访

  • Docker容器无法停止删除的解决方案

    查找运行的容器id docker ps 查找上面容器的物理位置 cd /var/lib/docker/container ls -a #此处会显示所有容器的id,找出上面那个无法停止删除的id(8位) 先停止docker服务 service docker stop 删除物理容器 rm -rf /var/lib/docker/container/{上面找到的id} 重启docker服务 service docker start 补充:Docker 退出容器不停止容器运行 并重新进入正在运行的容器

  • docker容器下配置jupyter notebook的操作

    docker容器下配置jupyter notebook,主要是为了编写python代码,更具体点是做深度学习的开发. jupyter web形式最高效的使用方式就是部署在云上,不管是cpu云服务器还是gpu的云服务器,都能快速启动使用. 而docker的出现又方便了很多在部署使用上. - 安装 docker docker分为docker CE和docker EE,一般使用docker CE(社区版本). docker可以在Linux(ubuntu.centos).MacOS.Windows或者树

  • Docker多个容器不能有相同端口号的处理方案

    问题背景 在docker里用同一份镜像创建4个容器,网络选择bridge模式,A服务在四个容器中都使用了同一个端口号(6000):为了减少对外暴露的端口数,另外使用了nginx对这4个服务实例做代理,4个服务实例分属4个upstream,使用了类似/service1./service2的路径来访问4个实例. 此时从本地访问任一服务,则会报502错误,百思不得其解. connect() failed (111: Connection refused) while connecting to ups

  • docker win ping 不通容器 避坑指南

    使用win docker-desktop,想连接容器开发,尝试了各种网络上的路子.kill my much time! 桥接是不行的, 手动添加路由也是行不通的, 所以看到这个的你不要想用常规的方法使用win宿主机连接你的linux容器,截止2020.3.29 查看原因 Networking features in Docker Desktop for Windows 也就是说 目前不支持win与linux容器使用桥接通信. 不过端口映射还是可以的,就是添加端口多的话 有点麻烦. 致我逝去的好几

  • Docker容器不识别宋体等字体的解决方案

    问题背景: 在使用docker部署项目的时候,由于项目中调用打印控件默认使用的是系统字体,在windows上部署没有问题,但是在docker容器中运行的时候,由于docker中没有宋体等相关字体,导致系统报错无法找到相应的字体. 解决思路: 其实就像解决linux本身没有宋体的问题一样,也可以用来解决容器问题.发现其实很多docker容器的问题最后都可以仿照linux的解决思路来处理.大体就是下载宋体ttf.ttc文件,然后将其考入容器字体目录下,重启容器即可. 解决办法: 1.查看容器支持的字

  • Docker容器内不能联网的6种解决方案

    Docker容器内不能联网的6种解决方案 注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping 8.8.8.8) 1.使用–net:host选项 sudo docker run --net:host --name ubuntu_bash -i -t ubuntu:latest /bin/bash 2.使用–dns选项 sudo docker run --dns 8.8.8.8 --dns 8.8.4.4 --name ubunt

  • Docker容器跨主机通信overlay网络的解决方案

    目录 一.Docker主机间容器通信的解决方案 二.Docker Overlay Network 三.使用键值存储搭建Docker主机集群 4.1 系统环境 4.2 安装Consul 4.3 节点配置Dockre守护进程连接Consul 4.4 查看consul 中的节点信息 4.5 创建overlay网络 4.6 使用overlay网络启动容器 一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvl

  • Docker容器端口映射后突然无法连接的排查过程

    一.背景 一般需要对外提供服务的Docker容器,我们在启动时后使用-p命令将对外访问端口暴露给外部,例如启动Docker Registry,我们将5000端口映射出来供外部访问: docker run -d -p 5000:5000 registry 但最近碰到一个非常奇怪的情况:研发组里一个CentOS 7测试环境里部署有Docker Registry,并对外暴露了端口.启动容器后一段时间内都是可以正常工作的,但在不定时间间隔后,外部主机就会出现无法从仓库中拉取镜像的情况,提示TimeOut

  • 解决docker容器无法ping外网的问题

    今天在docker搭建redis环境的时候,发现yum拉取不到资源,上不到网,报了如下错误: http://mirrors.aliyun.com/centos/6.10/extras/x86_64/Packages/epel-release-6-8.noarch.rpm: [Errno 14] PYCURL ERROR 6 - "Couldn't resolve host 'mirrors.aliyun.com'" Trying other mirror. http://mirrors

  • 解决docker 容器设置中文语言包出现的问题

    如果在Docker 中采用 docker search centos 采用 docker pull docker.io/centos 下载基础镜像 这个镜像是不支持中文的,可以采用docker attach 容器ID进入容器后采用"locale"查看 可以采用"locale -a" 查看系统语言包,会发现没有中文包 解决方案: 1.yum install kde-l10n-Chinese -y 安装语言包(针对centos 7) 2.yum reinstall gl

  • Docker容器部署consul的详细步骤

    目录 Consul简介 Consul 使用场景 -consul部署- 容器服务自动加入consul集群 安装Gliderlabs/Registrator Gliderlabs/Registrator 测试服务发现功能是否正常 安装consul-template 安装nginx 配置并启动template Consul简介 Consul 是一个支持多数据中心分布式高可用的 服务发现 和 配置共享 的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public Li

  • Docker容器操作方法详解

    目录 一.常用命令 1.创建并启动容器 2.列出所有容器 3.进入容器 4.退出容器 5.停止容器 6.启动/重启一个已停止的容器 7.删除容器 二.使用帮助 一.常用命令 下面按照使用容器中的流程: 创建并启动容器 > 查询容器 > 进入容器 > 退出容器 > 停止容器 > 启动/重启容器 > 删除容器来介绍Dockers常用命令,带领小伙伴快速入门. 1.创建并启动容器 docer run 当操作者执行docker run时,运行的容器进程是隔离的,因为它有自己的文

  • 详解如何在 docker 容器中捕获信号

    我们可能都使用过 docker stop 命令来停止正在运行的容器,有时可能会使用 docker kill 命令强行关闭容器或者把某个信号传递给容器中的进程.这些操作的本质都是通过从主机向容器发送信号实现主机与容器中程序的交互.比如我们可以向容器中的应用发送一个重新加载信号,容器中的应用程序在接到信号后执行相应的处理程序完成重新加载配置文件的任务.本文将介绍在 docker 容器中捕获信号的基本知识. 信号(linux) 信号是一种进程间通信的形式.一个信号就是内核发送给进程的一个消息,告诉进程

  • 关于docker容器优雅退出的问题详解

    前言 最近因为工作的原因,谈到了关于如何正确的退出运行中的docker容器,这是一个非常值得讨论的话题了.本文将给出详细的介绍,下面来一起看看吧. 容器信号使用 我们跑在容器中的程序通常想在容器退出之前做一些清理操作,比较常用的方式是监听一个信号,延迟关闭容器. docker提供了这样的功能: ╰─➤ docker stop --help Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...] Stop one or more running

随机推荐