我的剧本没有下载具有相同标签名称的更新图像

Tay*_*man 5 jenkins ansible docker

我一直在使用 jenkins 来构建 docker 镜像,并且每次都使用最新的标签推送到 docker hub。我写了一个 ansible playbook,它将通过从 docker hub 拉取最新映像来部署 docker 映像。现在问题是 ansible 部署了具有相同标签的先前版本后,新的最新映像还没有被拉取。你能检查一下剧本吗?让我知道我应该更新哪一部分以获得所需的工作。

剧本:

---
- hosts: flask04
  tasks:
  - name: Pull Flask app  image
    docker_image:
      name: taybur/flaskapp_27032019
      tag: latest
      state: present 

  - name: remove flask app container
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     state: absent

  - name: Create flask app container
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     ports:
       - "5001:5001"
     state: started
Run Code Online (Sandbox Code Playgroud)

Zei*_*tor 6

docker_image如果镜像已经存在,模块将不会自动拉取镜像。您必须使用force: yes参数在每次运行时强制拉动。

此外,docker_container如果图像不存在,可以为您拉取图像。您可以告诉它尝试在每次运行 ( pull: true)上拉取并在需要时重新启动容器。因此,在这种情况下,您可以将一组任务减少为一个:

  - name: Create/Update the flask app container if needed
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     pull: true
     ports:
       - "5001:5001"
     state: started
Run Code Online (Sandbox Code Playgroud)

请参阅docker_containerdocker_image的模块文档

更进一步

  1. 照原样,如果您重新启动运行 docker 守护程序的服务器,您的容器将不会重新启动。restart_policy: always如果您需要此功能,则需要使用。
  2. 尽管这个例子完成了这项工作,但它不是幂等的:图像的变化将导致两次剧本运行之间的变化,尽管你的剧本或变量中没有任何修改。处理此问题的一种方法是pull使用一个变量使参数动态化,您将在命令行上将其用作额外的 var:
  - name: Create/Update the flask app container if needed
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     pull: "{{ upgrade_flaskapp | default(false) | bool }}"
     restart_policy: always
     ports:
       - "5001:5001"
     state: started
Run Code Online (Sandbox Code Playgroud)

现在,如果您正常运行剧本,它将:

  • 如果不存在则拉取映像,如果尚未运行则创建容器
  • 如果容器已经在运行,什么都不做并报告 ok

如果你运行ansible-playbook -i <inventory> playbook.yml -e upgrade_flaskapp=true它会:

  • 拉取最新的镜像,如果不存在则创建一个容器。
  • 如果有可用的图像,则获取新版本,并在需要时使用新图像重新启动容器。
  • 如果容器存在并且没有可用的新图像,则什么都不做(报告 ok)。