如何使用' docker_container'强制删除docker容器? Ansible的模块?

时间:2017-04-07 08:42:38

标签: docker ansible ansible-2.x dockerpy

在介绍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信号。我已经更新了问题,以更好地反映我真正想要实现的目标。

1 个答案:

答案 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不会将信号转发给您的命令。

至于Dominique Burton's blog

  

如果您希望Docker将信号转发给您,请始终使用exec表单   (子)过程。这不仅对发送自定义信号很重要   到Docker容器,正确停止也很重要(即   码头停止)一个容器。