用ansible停止所有现有的docker容器

问题描述 投票:0回答:2

我正在创建一个角色来在托管不同码头集装箱的虚拟机上进行操作系统和配置更新。

在角色开始时,我想停止所有泊坞窗容器,如果有的话。我已经找到了该线程enter link description here,但是它有点旧,所以我尝试打开一个新问题。希望没事。

最简单的方法是这样:

- name: Stop docker containers
  shell: |
    docker stop $(docker ps -aq)

[不幸的是,当主机没有Docker容器时,我收到一个错误。我认为,使用“ ignore_errors:yes”并不是一个好方法。所以我尝试了这种方式

- name: Get info on docker host and list images
  docker_host_info:
    containers: yes
  register: containers_to_stop

- name: Stop docker containers
  shell: |
    docker stop $(docker ps -aq)
  when: containers_to_stop.containers != 0

但仍与第一部分相同。主机没有Docker容器时出现错误。

所以在链接线程中,我试图像这样使用“ docker_container”模块:

- name: Get info on docker host and list images
  docker_host_info:
    containers: yes
  register: containers_to_stop

- name: Stop running docker containers
  docker_container:
    name: '{{ item.Names }}'
    image: '{{ item.Image }}'
    state: stopped
  loop: '{{ containers_to_stop.containers }}'

[不幸的是,“ docker_host_info”模块无法正常工作,因为我所有的docker容器名称都将以“ /”开头。我已经为大家调试过:

failed: [app01] (item={u'Status': u'Up 12 minutes', u'Command': u'./replace_props_and_start.sh', u'Names': [u'/image-name'], u'Created': 1588071879, u'Image': u'image-name', u'Ports': [{u'IP': u'0.0.0.0', u'Type': u'tcp', u'PublicPort': 8091, u'PrivatePort': 80}], u'Id': u'ad5b0b3d6d623e2ac1d0a2ead9fbbf8a5ce5bca58492410a31035fd160de149a'}) => {"ansible_loop_var": "item", "changed": false, "item": {"Command": "./replace_props_and_start.sh", "Created": 1588071879, "Id": "ad5b0b3d6d623e2ac1d0a2ead9fbbf8a5ce5bca58492410a31035fd160de149a", "Image": "image-name", "Names": ["/image-name"], "Ports": [{"IP": "0.0.0.0", "PrivatePort": 80, "PublicPort": 8091, "Type": "tcp"}], "Status": "Up 12 minutes"}, "msg": "Error creating container: 400 Client Error: Bad Request (\"Invalid container name (['/image-name']), only [a-zA-Z0-9][a-zA-Z0-9_.-] are allowed\")"}

因此,在ansible为我创建的目录中,我的容器名为/ image-name而不是image-name。因此错误很明显,但是我该如何解决?

也许这是一个模块问题,我需要去烦恼的开发人员吗?

感谢和问候,大卫

docker ansible
2个回答
1
投票

不幸的是,“ docker_host_info”模块无法正常工作,因为我所有的docker容器名称都将以“ /”开头。

这不是(整个)问题;问题是在docker_host_info返回的值中,names是一个列表。仔细查看该错误消息:

400 Client Error: Bad Request (\"Invalid container name (['/image-name']), only [a-zA-Z0-9][a-zA-Z0-9_.-] are allowed\")"}

看看您如何传递['/image-name']作为容器名称?您将需要执行以下操作:

- name: Get info on docker host and list images
  docker_host_info:
    containers: yes
  register: containers_to_stop

- name: Stop running docker containers
  docker_container:
    name: '{{ item.Names.0[1:] }}'
    image: '{{ item.Image }}'
    state: stopped
  loop: '{{ containers_to_stop.containers }}'

在上面的代码中,我们要求Names列表(item.Names.0)中的第一个元素,然后我们选择除第一个字符之外的所有内容(因此/something变为something)。] >


0
投票

以下在我的家用计算机上做得很好。如docker_container模块文档中所述,您可以使用其短ID或长ID字符串来标识正在运行的容器。长id在docker_host_info的输出中可用。

© www.soinside.com 2019 - 2024. All rights reserved.