【问题标题】:Adding a font to a docker image将字体添加到 docker 图像
【发布时间】:2022-05-10 18:41:33
【问题描述】:

我的公司有一个 docker 映像,我们将其用于应用引擎 flex。我需要添加一个字体,而且似乎没有一个简单的 apt 包在任何地方,所以我需要手动添加它,按照here 列出的步骤在 Linux 上进行命令行安装。到目前为止,这是我所拥有的:

FROM gcr.io/google_appengine/python

# ...

# Copy the font to the appropriate location.
# The font is in a ttf in the same directory as the Dockerfile.
RUN mkdir -p /usr/share/fonts/truetype/noto
COPY NotoColorEmoji.ttf /usr/share/fonts/truetype/noto
RUN chmod 644 /usr/share/fonts/truetype/noto/*

# Rebuild the font cache.
RUN fc-cache -fv

如您所见,该图像基于 GAE 基础 python 图像。我们还添加了一些其他内容,但这是与字体相关的内容。

构建图像时的fc-cache 输出清楚地表明它正在检测 noto 目录中的一种字体:

/usr/share/fonts/truetype/noto: caching, new cache contents: 1 fonts, 0 dirs

当我登录到一个容器时,我看到文件确实被复制了。我什至可以再次手动运行fc-cache 并看到相同的输出。但是,新字体从未反映在 fc-list 中。

诊断此问题令人沮丧,因为执行类似步骤似乎在我自己的机器上完美运行。几乎就像fc-cache 在容器中的行为不同。

关于我可能缺少什么的任何想法?

更新:

我在 docker 文件中添加了一行,以在复制字体文件后显式设置字体文件的正确权限,但没有任何区别。这是意料之中的,因为这些命令最终以 root 身份运行,但它似乎仍然是一种更好的做法。

不过,有趣的是,我尝试使用不同的字体 (NotoEmoji-Regular.ttf),它确实 工作。我将研究这两种字体之间的差异可能是什么原因造成的。

非常沮丧。

另一个更新:

似乎主要区别可能是字体中的颜色,这在 TrueType 格式中是非标准的。正如 cmets 所指出的,我的系统使用的 fontconfig 版本比 docker 映像更新,这可能是造成差异的原因。

我想验证这一点,但它挖了一个兔子洞,我的组织不希望我花太多时间在上面。如果有人能够这样做,但是我很乐意给你接受的答案。否则我将不得不暂时搁置一下。

【问题讨论】:

  • 我知道有像github.com/docker/hub-feedback/issues/1375 这样的问题,但以防万一,您能否关注github.com/KWARC/localmh/issues/217(从 Dockerfile 完成)并查看最终结果(图像)是否包含预期的字体?
  • 会不会是尺寸的原因?似乎所有的字体都小于 1 MB,而这个是 5MB+?
  • 这可能不是docker问题,而是fc的环境版本问题。我在 Ubuntu 16.04 docker 上进行了测试,我得到 fc-list 工作正常。 fc-list -V fontconfig version 2.11.94。但是对于debian 8debian 9,版本是2.11.0。现在这可能是 fc 本身或依赖项之一中的错误
  • @TarunLalwani 我有相同的版本差异。很可能是这样,特别是因为所讨论的字体是彩色字体,因此在 TrueType 中是非标准的。最终,在这种情况下,我只会使用非彩色字体,但是当我有时间时,我会看看是否可以更新图像上的 fc。
  • 在云存储中托管您的字体是一种选择吗?在我看来,您可能会因为尝试将其与您的应用程序捆绑在一起而让自己陷入不必要的头痛。

标签: google-app-engine docker fonts


【解决方案1】:

是字体文件有问题,查看image的报告

【讨论】:

  • 是的,我想这些是由于字体中使用了颜色而导致的兼容性问题。我对这种字体了解得越多,对此我就越不感到惊讶。不过,在日志中实际看到它会有所帮助,所以谢谢!
  • 根据这个 github 链接 github.com/googlei18n/noto-emoji/issues/200 ,这似乎是社区的一个已知问题。不知道它是否会很快得到解决。
【解决方案2】:

我在 Docker 文件中使用下面的命令来安装字体,这对我有用。

RUN apt update && apt install fonts-indic -y \
    && fc-cache -f    

RUN apk add font-noto-gujarati font-noto-kannada font-noto-avestan font-noto-osage font-noto-kayahli font-noto-oriya font-noto-telugu font-noto-tamil font-noto-bengali font-noto-malayalam font-noto-arabic font-noto-extra \
    && fc-cache -f

注意:您可以根据需要添加更多字体名称。

【讨论】:

    【解决方案3】:

    尝试添加到dockerfile

    # install fontconfig
    RUN apt-get update; apt-get install -y fontconfig
    
    # refresh system font cache
    RUN fc-cache -f -v
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2015-03-30
      • 2014-07-25
      • 2018-09-23
      • 2020-01-21
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多