我试图首先停止所有正在运行的容器,然后将其删除。
我知道我可以使用Anslible shell包并运行以下命令来完成它:
docker container stop $(docker container ls -aq)
第二步,我可以对shell包做同样的事情,并清理死的容器/图像/卷:
docker system prune -a -f --volumes
我已经尝试过这样的事情(代码示例):
- name: Stop all containers:
shell: "docker container stop $(docker container ls -aq)"
ignore_errors: yes
不幸的是,当容器为0时,这引发了我要处理的错误。
我可以通过添加以下内容来改善它:
- name: Get info on docker host and list images
docker_host_info:
containers: yes
register: result
- name: Stop all containers
shell: "docker container stop $(docker container ls -aq)"
when: result.host_info.Containers != 0
我想通过纯粹使用Ansible软件包来做到这一点(docker_host_info)。我能够提取包含容器在内的复杂列表,其中包含所有信息,但是找不到找到容器ID或名称的方法。
我的计划是在ID或名称之后循环播放,并一一停止。
我设法提取了一些容器(字符串格式),但是我找不到将其转换为索引的方法,所以我可以循环遍历。
代码示例:
- name: Get info on docker host and list images
docker_host_info:
containers: yes
register: result
- name: Debug dockerInfo
debug:
var: result.containers
# var: result.host_info.Containers
# loop: "{{ result.host_info.Containers }}"
# loop: "{{ range(0, 4)|list }}"
when: result.host_info.Containers != 0
是否可以将返回的字符串转换为索引并通过该索引进行迭代,例如(伪造的代码示例):
- name: Debug dockerInfo
debug:
var: "{{ result.containers[item].Id }}
loop: result.host_info.Containers
when: result.host_info.Containers != 0
答案 0 :(得分:1)
result.containers
是一个列表,因此您可以直接对其进行迭代:
- name: Debug dockerInfo
debug:
var: item
loop: "{{ result.containers }}"
when: result.containers | length != 0
顺便说一句,var
中的debug
仅采用变量名,要调试表达式,您必须改用msg
。
BTW2,对于loop
关键字,您必须使用花括号来计算表达式。