1

我一直在使用谷歌的容器优化操作系统在 GCP 计算引擎虚拟机上部署容器。当主机 VM 在 GCP 中停止时,我一直在努力理解已部署容器的关闭行为。

当我的容器收到 SIGTERM 或 SIGINT 信号时,它们会执行一些清理行为并将一些文件写入已安装的卷中。我已经用docker stopand对此进行了广泛的测试docker kill -s SIGINT。但是,当我在 GCP 中停止主机时,似乎没有发生这种行为。

我不完全确定如何调试这个过程。我尝试连接到 VM 的串行控制台,但它似乎没有任何与容器关闭逻辑有关的信息。

任何指导将不胜感激!作为参考,是我正在部署的图像。


完整复制步骤:

使用“将容器映像部署到此虚拟机”创建一个新的“计算引擎”虚拟机。我一直在使用带有 20GB 引导盘的 e2 介质。

使用“ lloesche/valheim-server ”图像。

设置以下环境变量:

SERVER_NAME: Test
WORLD_NAME: Test
SERVER_PASS: Password # must be at least 5 characters

添加类型为“Directory”的目录挂载,其中“/config”作为挂载路径,“/home/YOUR_GCP_USERNAME/valheim-server-config”作为“读/写”模式下的主机路径。

容器启动后,您应该在主机 (lloesche/valheim-server) 上运行映像。您还应该在~/valheim-server-config/worlds/called处创建一个文件Test.fw1

现在,停止这个容器 ( docker stop) 应该会导致对该文件的写入。您可以通过停止容器然后观察该文件的修改日期来验证这一点。

但是,当主机实例停止时,似乎不会发生此过程。如果您重新启动主机以使容器再次运行,然后向主机发出“停止”,则在容器被杀死之前不会保存该文件。

4

2 回答 2

0

我遇到了同样的问题,我找到了一种解决方法(不完美,但对我有用)。添加为您的启动脚本的一部分:

mkdir -p /etc/systemd/system/docker.service.d
printf "[Service]\nExecStop=/bin/sh -c 'docker stop \$(docker ps -q)'" > /etc/systemd/system/docker.service.d/override.conf

通常(在这种情况下也是为了测试)您可以编辑覆盖文件(将您的配置添加到现有配置中)sudo systemctl edit docker.service。不幸的是,覆盖文件显然在每次系统启动时都会被删除,这就是我通过启动脚本将其持久化的原因。

在这种方法之前,a 尝试了 Wojtek_B 的建议(抱歉,我的声誉太低,无法直接发表评论)但没有奏效。原因是,docker 守护进程在处理关闭脚本之前获得终止信号。由于在“容器优化操作系统”的关闭脚本中涉及 docker 失败(或至少有风险),它可以被视为一个错误。

于 2021-07-19T17:14:53.983 回答
0

我浏览了日志,没有发现任何可以为我提供解决方案的东西。

但是,可能有解决方法。

您可以在 VM 关闭之前使用关闭脚本更“优雅地”停止容器;

gcloud您可以使用以下命令提供脚本:

gcloud compute instances create example-instance \
    --metadata-from-file shutdown-script=examples/scripts/install.sh

或使用控制台 UI

在 Cloud Console 中,直接使用 shutdown-script 元数据键指定关闭脚本:

在 GCP Console 中,转到虚拟机实例页面。转到虚拟机实例

单击创建实例。在创建新实例页面上,填写您的实例的属性。对于高级配置选项,展开管理、安全、磁盘、网络、单一租赁部分。在 Metadata 部分,填写 shutdown-script 作为元数据键。在“值”框中,提供关闭脚本的内容。单击创建以创建实例。

最终,您可以在Google Issuetracker上创建一个新问题并解释您的期望(什么样的行为)。

于 2021-02-26T11:08:06.343 回答