跳转至

如何自定义带有Windows字体的Docker镜像?


2017-07-11 by dongnan

目标

某个项目需要使用 Windows 字体,但是大部分的 Docker镜像使用的是 Linux 系统,所以是没有 Windows 字体的。 我们的目标是为 Docker容器,添加 Windows 字体。

环境

# 操作系统
head -n1 /etc/issue
Ubuntu 16.04.2 LTS \n \l

# 字体目录
Ubuntu 系统,字体文件目录 /usr/share/fonts/ 
Windows 7系统,微软雅黑字体文件 C:\Windows\Fonts\msyh.ttf

步骤

  • 拷贝 windows 系统中的字体文备用。
  • 创建目录, docker mkdir -p /usr/share/fonts/winFonts
  • 拷贝字体文件, docker cp ~/msyh.ttf /usr/share/fonts/winFonts
  • 更改权限,docker chmod -R 644 /usr/share/fonts/winFonts
  • 刷新字体缓存, docker fc-cache -fv

验证

检查字体文件是否在缓存中

fc-cache -v | grep -i 'winfonts'
/usr/share/fonts/winFonts: skipping, existing cache is valid: 9 fonts, 0 dirs

扩展

我们知道容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此任何保存于容器存储层的信息都会随容器删除而丢失

为了不重复的执行上述步骤,建议整理上述的步骤, 然后使用 Dockerfile 定制带有 Windows 字体的镜像,这样我们每次创建的容器默认就带有 Windows 字体。

Dockerfile 文件

cat Dockerfile

    FROM ubuntu
    MAINTAINER dongnan

    # apt
    COPY conf/sources.list /etc/apt/sources.list

    # env
    ENV TZ=Asia/Shanghai LANG=en_US.UTF-8

    # ttf
    RUN mkdir -p /usr/share/fonts/winFonts
    COPY src/ttf/* /usr/share/fonts/winFonts/
    RUN chmod -R 644 /usr/share/fonts/winFonts
    RUN fc-cache -fv

    # test
    RUN fc-cache -v | grep -i 'winfonts'

帮助

fc-cache -h
usage: fc-cache [-EfrsvVh] [-y SYSROOT] [--error-on-no-fonts] [--force|--really-force] [--sysroot=SYSROOT] [--system-only] [--verbose] [--version] [--help] [dirs]
Build font information caches in [dirs]
(all directories in font configuration by default).

  -E, --error-on-no-fonts  raise an error if no fonts in a directory
  -f, --force              scan directories with apparently valid caches
  -r, --really-force       erase all existing caches, then rescan
  -s, --system-only        scan system-wide directories only
  -y, --sysroot=SYSROOT    prepend SYSROOT to all paths for scanning
  -v, --verbose            display status information while busy
  -V, --version            display font config version and exit
  -h, --help               display this help and exit

欢迎关注微信公众号: 运维录

Back to top