在介绍cadvisor - 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 module docs)中提供的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信号。我已经更新了问题,以更好地反映我真正想要实现的目标。
答案 0 :(得分:1)
我认为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
不确定这是您遇到问题的原因,但可能是shell形式的CMD不会将信号转发给您的命令。
如果您希望Docker将信号转发给您,请始终使用exec表单 (子)过程。这不仅对发送自定义信号很重要 到Docker容器,正确停止也很重要(即 码头停止)一个容器。