【问题标题】:My playbook is not downloading the updated images with same tag name我的剧本没有下载具有相同标签名称的更新图像
【发布时间】:2019-08-21 02:11:26
【问题描述】:

我一直在使用 jenkins 构建 docker 镜像,并每次都使用最新的标签推送到 docker hub。 我已经编写了一个 ansible 剧本,它将通过从 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

【问题讨论】:

    标签: docker jenkins ansible


    【解决方案1】:

    docker_image 模块将不会自动拉取已经存在的图像。您必须使用force_source: yes 参数(使用source: pull)来强制每次运行时拉动。

    注意:在 ansible 2.8 之前,参数为 force: yes。它已在 2.9 中弃用并在 2.12 中删除。自发布以来,提及source: pull 也是强制性的

    此外,如果图像不存在,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
    

    请参阅 docker_containerdocker_image 的模块文档

    更进一步

    1. 照原样,如果您重新启动运行 docker 守护程序的服务器,您的容器将不会重新启动。如果您需要此功能,则需要使用restart_policy: always
    2. 尽管此示例完成了这项工作,但它不是幂等的:图像的更改将导致两次 playbook 运行之间的变化,尽管您的 playbook 或变量中没有任何修改。处理此问题的一种方法是使用一个变量使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
    

    现在如果你正常运行 playbook,它将:

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

    如果您使用ansible-playbook -i <inventory> playbook.yml -e upgrade_flaskapp=true 运行,它将:

    • 如果不存在,则拉取最新的镜像并创建一个容器。
    • 如果有可用的映像,请获取新版本的映像,并在需要时使用新映像重新启动容器。
    • 如果容器存在且没有可用的新图像,则不执行任何操作(报告正常)。

    【讨论】:

      【解决方案2】:

      理想情况下,我们的任务/角色应该是幂等的(如果重复运行,则跳过重复的工作)。因此,我认为使用版本号标记您的构建并在部署中使用版本号而不是最新版本会更简洁。

      【讨论】:

        【解决方案3】:

        作为安装前清理的一部分,我通常会删除旧图像。 您应该首先删除图像,就像删除容器一样。这将强制 ansible 拉取新版本的图像。

        ---
        - hosts: flask04
          tasks:
          - name: Remove Flask app  image
            docker_image:
              name: taybur/flaskapp_27032019
              tag: latest
              force: true
              state: absent 
        
          - 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
        

        【讨论】:

        • 您可以在一个任务中完成所有这些工作,该任务将负责更新映像并仅在需要时在新映像上重新启动容器。看我的回答。
        猜你喜欢
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 2014-10-20
        • 2016-01-10
        • 1970-01-01
        相关资源
        最近更新 更多