我一直在使用谷歌的容器优化操作系统在GCP计算引擎虚拟机上部署容器。当主机虚拟机在GCP中停止时,我一直在努力理解部署的容器的关闭行为。
当我的容器接收到SIGTERM或SIGINT信号时,它们会执行一些清理行为,并将一些文件写入挂载的卷。我已经用docker stop
和docker kill -s SIGINT
广泛测试了这一点。然而,当我在GCP中停止主机时,似乎不会发生这种行为。
我不太确定如何调试这个过程。我尝试连接到VM的串行控制台,但它似乎没有任何关于容器关闭逻辑的信息。
任何指导都将非常感谢!作为参考,this是我正在部署的映像。
完整复制步骤:
创建一个新的“Compute Engine”VM,并设置“Deploy a container image to this VM”。我一直在使用带有20 GB Boot 磁盘的e2介质。
使用“lloesche/valheim-server“图像。
设置以下env变量:
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/
上创建一个名为Test.fw1
的文件。
现在,停止这个容器(docker stop
)应该会导致对该文件的写入。您可以通过停止容器然后观察该文件的修改日期来验证这一点。
但是,当 host 示例停止时,此过程似乎不会发生。如果您重新启动主机,使容器再次运行,然后向主机发出“stop”,则在容器被杀死之前,该文件不会保存。
3条答案
按热度按时间zzwlnbp81#
我也遇到了同样的问题,我找到了一个解决方案(不完美,但对我来说很有效)。添加为您的startup-script的一部分:
字符串
通常情况下(在测试中也是如此),你可以用
sudo systemctl edit docker.service
编辑覆盖文件(它将你的配置添加到现有的配置中)。不幸的是,每次系统启动时,覆盖文件都会被删除,这就是为什么我通过startup-script持久化它。在此之前,a尝试了Wojtek_B建议的方法(抱歉,我的声誉太低,无法直接评论),但没有成功。原因是,docker守护进程在关闭脚本处理之前获得终止信号。由于在“容器优化操作系统”的关闭脚本中涉及docker失败(或至少有风险),因此可以将其视为bug。
qlzsbp2j2#
扩展@Michael Korn的答案,这对我来说确实有效
我建议使用以下完整的启动脚本
字符串
docker systemd unit在启动脚本编写之前已经启动,因此首先systemd需要重新读取docker unit的配置(daemon-reload),然后重新启动docker unit。
如果通过
create-with-container
使用“Containers on Compute Engine”,则使用示例命令(未以这种最小形式进行测试,抱歉)型
bq3bfh9z3#
我看了日志没有发现任何能解决问题的线索。
然而,可能有一个解决方案。
您可以使用shutdown脚本在VM关闭之前更“优雅”地停止容器;
您可以使用
gcloud
命令提供脚本:字符串
或使用控制台UI:
在云控制台中,使用shutdown-script元数据键直接指定关机脚本:
在云控制台中,转到VM示例页面。转到VM示例
单击创建示例。在“创建新示例”页上,填写示例的属性。对于高级配置选项,请展开“管理”、“安全性”、“磁盘”、“网络”、“唯一租用"部分。在”元数据“部分中,填写shutdown-script作为元数据键。在”值“框中,提供shutdown-script的内容。单击创建以创建示例。
最终,您可以在Google Issuetracker上创建一个新问题,并解释您期望的内容(什么样的行为)。