容器优化操作系统Docker行为

ivqmmu1c  于 11个月前  发布在  Docker
关注(0)|答案(3)|浏览(154)

我一直在使用谷歌的容器优化操作系统在GCP计算引擎虚拟机上部署容器。当主机虚拟机在GCP中停止时,我一直在努力理解部署的容器的关闭行为。
当我的容器接收到SIGTERM或SIGINT信号时,它们会执行一些清理行为,并将一些文件写入挂载的卷。我已经用docker stopdocker 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”,则在容器被杀死之前,该文件不会保存。

zzwlnbp8

zzwlnbp81#

我也遇到了同样的问题,我找到了一个解决方案(不完美,但对我来说很有效)。添加为您的startup-script的一部分:

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编辑覆盖文件(它将你的配置添加到现有的配置中)。不幸的是,每次系统启动时,覆盖文件都会被删除,这就是为什么我通过startup-script持久化它。
在此之前,a尝试了Wojtek_B建议的方法(抱歉,我的声誉太低,无法直接评论),但没有成功。原因是,docker守护进程在关闭脚本处理之前获得终止信号。由于在“容器优化操作系统”的关闭脚本中涉及docker失败(或至少有风险),因此可以将其视为bug。

qlzsbp2j

qlzsbp2j2#

扩展@Michael Korn的答案,这对我来说确实有效
我建议使用以下完整的启动脚本

#!/bin/bash

# ensure SIGTERM is sent to ALL docker containers if the instance is killed
mkdir -p /etc/systemd/system/docker.service.d
cat <<EOF >/etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStop=/bin/sh -c 'docker ps -q | xargs docker stop --signal TERM --time 60'
EOF
systemctl daemon-reload
systemctl restart docker

字符串
docker systemd unit在启动脚本编写之前已经启动,因此首先systemd需要重新读取docker unit的配置(daemon-reload),然后重新启动docker unit。
如果通过create-with-container使用“Containers on Compute Engine”,则使用示例命令(未以这种最小形式进行测试,抱歉)

gcloud compute instances create-with-container test \
  --container-image=gcr.io/your-image:latest \
  --create-disk=auto-delete=yes,device-name=test,image-project=cos-cloud,image-family=cos-101-lts,mode=rw,size=10GB,type=pd-balanced \
  --metadata-from-file=startup-script=path/to/startup-script.sh

bq3bfh9z

bq3bfh9z3#

我看了日志没有发现任何能解决问题的线索。
然而,可能有一个解决方案。
您可以使用shutdown脚本在VM关闭之前更“优雅”地停止容器;
您可以使用gcloud命令提供脚本:

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

字符串
或使用控制台UI:
在云控制台中,使用shutdown-script元数据键直接指定关机脚本:
在云控制台中,转到VM示例页面。转到VM示例
单击创建示例。在“创建新示例”页上,填写示例的属性。对于高级配置选项,请展开“管理”、“安全性”、“磁盘”、“网络”、“唯一租用"部分。在”元数据“部分中,填写shutdown-script作为元数据键。在”值“框中,提供shutdown-script的内容。单击创建以创建示例。
最终,您可以在Google Issuetracker上创建一个新问题,并解释您期望的内容(什么样的行为)。

相关问题