我正在创建一个Ansible角色,用于对托管不同Docker容器的虚拟机进行操作系统和配置更新。
在角色开始时,如果有Docker容器存在,我想停止所有Docker容器。我发现了这个线程,但它有点老旧,所以我正在尝试提出一个新问题,请问可以吗?
最简单的方法是这样的:
- 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")"} ```
所以我的容器名为 `/image-name` 而不是 Ansible 为我创建的目录中的 `image-name`。因此错误是明显的,但如何解决呢?
也许这是一个模块问题,我需要联系 Ansible 的开发人员吗?
感谢和问候,