我的公司有一个docker图像,我们用它来app引擎flex.我需要添加一个字体,并且在任何地方似乎都没有简单的apt包,所以我需要手动添加它,按照此处列出的步骤在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
Run Code Online (Sandbox Code Playgroud)
如您所见,图像基于GAE基本python图像.我们还添加了一些其他内容,但这是与字体相关的内容.
fc-cache
构建映像时的输出清楚地表明它正在检测noto目录中的一种字体:
/usr/share/fonts/truetype/noto: caching, new cache contents: 1 fonts, 0 dirs
Run Code Online (Sandbox Code Playgroud)
当我登录到容器时,我发现该文件确实被复制了.我甚至可以fc-cache
手动再次运行并看到相同的输出.但是,新字体永远不会反映出来fc-list
.
诊断这一点令人沮丧,因为遵循类似的步骤似乎在我自己的机器上完美运行.这几乎就好像fc-cache
容器中的行为不同.
关于我可能遗失的任何想法?
更新:
我在docker文件中添加了一行,以便在复制后在字体文件上显式设置正确的权限,但没有区别.这是预期的,因为这些命令最终以root身份运行,但它仍然是一种更好的做法.
有趣的是,我尝试使用不同的字体(NotoEmoji-Regular.ttf)并且确实有效.我将研究这两种字体之间的区别是什么导致这种情况.
很沮丧.
另一个更新:
看起来主要区别可能是字体中的颜色,这在TrueType格式中是非标准的.正如评论所指出的那样,我的系统使用的是fontconfig的新版本而不是docker图像,这可能是造成这种差异的原因.
我想验证这一点,但它正在挖掘一个兔子洞,我的组织宁愿我不要花太多时间.如果有人能够这样做,但我很乐意给你接受的答案.否则我将不得不离开这一点.
我正在努力实现节点 API 的正常关闭。通常,在开发过程中,这个过程是使用通用start
脚本启动的,但我注意到这会导致一些令人讨厌的行为,令我惊讶的是,在我作为节点开发人员的 3 年左右的时间里,我从未真正注意到过这些行为。
要在开发期间开始关闭,我们只需在 bash 终端中按 ctrl+C,这当然会导致SIGINT
将 a 发送到 npm 进程及其所有子进程。我可以使用process.on
处理程序捕获此信息,以从那里启动正常关闭 - 关闭新请求,等待现有请求完成,然后终止数据库连接,所有这些好东西。
但是,如果开发人员第二次按下 ctrl+C,npm 的行为会有所不同。它似乎正在向它最初sh
用来调用我的脚本的进程发送一个 SIGTERM 。start
这会导致该sh
进程打印出来Terminated
并退出,将终端的控制权返回给用户,而无需等待节点进程退出。
这真的很烦人,因为它给人的印象是节点进程已经停止,但当然它没有。它会一直持续到关闭完成,或者被 SIGKILL 或 SIGQUIT 等强制终止。如果它碰巧将任何内容打印到控制台,它将直接在开发人员现在可能在该终端中运行的任何其他内容中间执行此操作。
对于一个简单的例子,试试这个:
包.json:
{
"private": true,
"scripts": {
"start": "node index.js"
}
}
Run Code Online (Sandbox Code Playgroud)
索引.js:
{
"private": true,
"scripts": {
"start": "node index.js"
}
}
Run Code Online (Sandbox Code Playgroud)
npm start
在终端中运行,然后按 ctrl+c 一次。您将看到信号到达节点,但它当然不会退出。现在,再做一次。您将看到信号再次通过,但您会立即看到“Termied”,然后是 shell 提示符。直到你找到节点进程的进程 ID 并杀死它,kill -9
你才会继续看到它waiting...
您将每隔五秒
我对这个例子做了一些更多的摆弄,看起来 npm 完全对此负责。如果您发送kill …