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

问题描述 投票:0回答:2

我一直在使用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
docker jenkins ansible
2个回答
0
投票

如果图像已经存在,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

请参阅docker_containerdocker_image的模块文档

更进一步:

  1. 如果重新启动运行docker守护程序的服务器,您的容器将不会重新启动。如果需要此功能,则需要使用restart_policy: always
  2. 虽然这个例子完成了这项工作,但它并不是幂等的:虽然你的剧本或变量中没有修改任何内容,但是图像的更改会导致两个剧本之间的变化。处理此问题的一种方法是使用一个变量使pull参数动态化,该变量将用作commande行的额外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

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

  • 如果不存在则拉出图像并创建容器(如果尚未运行)
  • 如果容器已在运行,则不执行任何操作并报告正常

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

  • 获取新版本的图像(如果有)并根据需要使用新图像重新启动容器。
  • 如果存在容器且没有新图像,则不执行任何操作。

0
投票

在安装之前,我通常会删除旧图像作为清理的一部分。您应该首先删除图像,就像删除容器一样。这将迫使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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.