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

时间:2019-03-30 07:32:23

标签: docker jenkins ansible

我一直在使用jenkins构建docker映像,并每次都使用最新标签将其推送到docker hub。 我写了一个ansible剧本,它将通过从docker hub提取最新映像来部署docker映像。现在的问题是,一旦ansible部署了具有相同标签的先前版本,新的最新映像还没有被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

3 个答案:

答案 0 :(得分:0)

通常,在安装之前,我会先删除旧映像,作为清理工作的一部分。 您应该首先删除图像,就像删除容器一样。这将迫使ansible拉出新版本的图片。

MyIncompleteMethod

  self flag: #toImplement.  
  self notYetImplemented.`

答案 1 :(得分: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 daemon的服务器,则容器将不会重新启动。如果需要此功能,则需要使用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

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

  • 如果不存在则拉图像,如果尚未运行则创建容器
  • 不执行任何操作,如果容器已在运行,请报告“确定”

如果您使用ansible-playbook -i <inventory> playbook.yml -e upgrade_flaskapp=true进行跑步,

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

答案 2 :(得分:0)

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