4

引入 cadvisor 后,我在从 docker 主机中删除容器时遇到问题 - https://github.com/google/cadvisor/issues/771

我有大量的 Ansible (2.2.1.0) 脚本,用于在这些 docker 主机上安装我的服务容器,并且它们在内部使用 docker_container 模块。很多时候,这些脚本想要删除容器,但由于上述问题,它们失败了。

我可以轻松地在这些 docker 主机上强制终止 docker 容器:

docker rm container_name -fv

所以我希望 docker_container 模块(docker_container 模块文档)中提供的 force_kill 选项应该能够做同样的事情:

- name: Delete  docker containers
  docker_container:
    name: "container_name"
    force_kill: true
    keep_volumes: false
    state: absent

但是脚本总是失败。如果它不能强制杀死它,我不知道这个选项的目的是什么。即使在启用 force_kill 之后,我的所有脚本都失败了,我需要知道如何确保此选项按预期工作?

更新:我现在明白 force_kill 选项正在发送 docker kill 信号。我已经更新了这个问题,以更好地反映我真正想要实现的目标。

4

1 回答 1

2

我认为force_kill发送一个终止信号作为docker kill所以

容器内的主进程将被发送 SIGKILL,或使用选项 --signal 指定的任何信号。

我会在图像的 Dockerfile 中检查 CMD 和/或 ENTRYPOINT(如果你使用它的话),因为

shell 形式的 ENTRYPOINT 和 CMD 作为 /bin/sh -c 的子命令运行,不传递信号。这意味着可执行文件不是容器的 PID 1 并且不接收 Unix 信号。

CMD ["/init.sh"] # exec form
CMD /init.sh     # shell form

不确定这是您问题的原因,但可能是外壳形式的 CMD 不会将信号转发给您的命令。

至于多米尼克伯顿的博客

如果您希望 Docker 将信号转发到您的(子)进程,请始终使用 exec 表单。这不仅对于向 Docker 容器发送自定义信号很重要,正确停止(即 docker stop)容器也很重要。

于 2017-04-07T11:14:38.167 回答