【发布时间】: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 8和debian 9,版本是2.11.0。现在这可能是fc本身或依赖项之一中的错误 -
@TarunLalwani 我有相同的版本差异。很可能是这样,特别是因为所讨论的字体是彩色字体,因此在 TrueType 中是非标准的。最终,在这种情况下,我只会使用非彩色字体,但是当我有时间时,我会看看是否可以更新图像上的 fc。
-
在云存储中托管您的字体是一种选择吗?在我看来,您可能会因为尝试将其与您的应用程序捆绑在一起而让自己陷入不必要的头痛。
标签: google-app-engine docker fonts