使用Ansible,如果docker pull抛出404错误,有没有办法拉另一个docker镜像?

时间:2019-02-04 15:13:04

标签: docker ansible docker-image

我想实现一个解决方案,如果一个泊坞窗映像由于不存在而无法被拉出,则改为拉另一个泊坞窗。

 - name: Pull an image
   docker_image:
     name: repository:stable
   with_list: "{{ repository }}"

例如,通常,如果标记为stable的图像不存在,则抛出404 Client Error: Not Found,是否有办法捕获此错误并拉存储库:最新?还是可能的解决方法,如果不存在第二种方法,则可以拉第二种方法。

我还使用它从存储库列表中提取许多docker映像。

在此问题上的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以使用错误处理block来捕获这种情况,如果您使用Ansible 2.1+,则新的ansible_failed_result变量也将使检查失败任务的结果更加容易。

如果您需要对失败执行多个任务操作,我会尝试这样的操作:

- block
    - name: Pull an image
      docker_image:
        name: repository:stable
      with_list: "{{ repository }}"
  rescue:
    - name: Do some etc parsing to determine the issue
      set_fact:
        pull_latest: '{{ "404" in ansible_failed_result }}'
    - name: Pull second image
      docker_image:
        name: repository:latest
      when: pull_latest

答案 1 :(得分:0)

潜在的问题是从block返回的错误消息由数组字典组成。每个数组对应于该执行的错误指令。

因此,我无法使用in,因为这是在属性上搜索精确匹配值,但是该属性嵌套在数组中。幸运的是,父对象上还有一个布尔属性为我提供了信息,所以我改用了failed键。码头工人镜像拉取失败时,failed为真。

- block:
   - name: Pull an image
   docker_image:
     name: repository:stable
   with_list: "{{ repositories }}"
   loop_control:
     loop_var: repository
rescue:
  - name: Pull latest-dev image
    docker_image:
      name: repository:latest
    when: ansible_failed_result.failed
    with_list: "{{ repositories }}"
    loop_control:
      loop_var: repository

主行是ansible_failed_result.failed,它是指字典中具有Failed: true的元素。