【问题标题】:Container Optimized OS Docker Shutdown Behavior容器优化 OS Docker 关闭行为
【发布时间】:2021-05-20 00:59:49
【问题描述】:

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

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

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

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


完整的复制步骤:

使用“将容器映像部署到此虚拟机”创建一个新的“计算引擎”虚拟机。我一直在使用带有 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/ 创建一个名为Test.fw1 的文件。

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

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

【问题讨论】:

  • 您能否提供有关您如何测试关机行为或您拥有的任何日志的更多详细信息?您是如何尝试测试的 - 让我们称之为“GCP 关闭”?你能提供复制的步骤吗?你在这里的目标是什么?
  • @Wojtek_B - 我的部分问题是在关机期间我没有看到与主机上的 docker 相关的任何日志。我提供了完整的复制步骤。
  • 我认为问题在于“INFO”中关闭的日志级别。容器操作系统日志级别设置得较低。我从来没有想出如何更改“持久”的意思,即更改重启实例后保持不变的级别。我对这个问题的 cmets 展示了如何更改日志记录级别(最后的第二条评论):stackoverflow.com/q/65721133/8016720
  • 来自引用问题的详细信息:编辑文件 /etc/stackdriver/logging.config.d/fluentd-lakitu.conf 查找“收集所有具有优先级 >= 警告的日志日志”部分。优先级为 0 -> 4。如果将“5”和“6”添加到列表中,则启动脚本会记录在操作日志中。但是,此更改不会在重新启动后持续存在。现在的问题是如何使这种变化持久化。
  • @JohnHanley - 我的 docker 服务的日志通常写得很好(我在 gce 日志资源管理器中看到它们)。但是,我在关闭实例后看到的第一个日志是容器收到“停止”命令大约一秒钟后的“守护进程关闭完成”日志。

标签: docker google-cloud-platform google-compute-engine google-container-os


【解决方案1】:

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

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 守护进程在处理关闭脚本之前获得终止信号。由于在“Container Optimized OS”的关闭脚本中涉及 docker 失败(或至少有风险),它可以被视为一个错误。

【讨论】:

    【解决方案2】:

    我浏览了日志,没有发现任何可以为我指明解决方案的地方。

    不过可能有解决方法。

    您可以使用shutdown script 在虚拟机关闭之前更“优雅”地停止您的容器;

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

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

    或使用console UI:

    在 Cloud Console 中,直接使用 关机脚本元数据键:

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

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

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

    【讨论】:

    • 感谢您的浏览!我确实尝试过,但似乎主机操作系统并未执行关闭脚本(通过元数据密钥提供)。我试图让它向 docker 容器发出关闭命令。我可能会再试一次,并在问题跟踪器上打开一个问题。再次感谢!
    • 感谢反馈 - 如果在您的情况下关闭脚本由于某种原因无法正常工作,请在 IssueTracker 报告错误,因为这可能会影响更多用户。
    猜你喜欢
    • 2014-01-16
    • 1970-01-01
    • 2019-02-12
    • 2016-01-01
    • 2014-03-08
    • 2013-05-30
    • 1970-01-01
    • 2015-06-10
    • 2017-12-07
    相关资源
    最近更新 更多