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

标签 docker jenkins ansible

我一直在使用 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_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
更进一步:
  • 照原样,如果您重新启动运行 docker 守护程序的服务器,您的容器将不会重新启动。您需要使用 restart_policy: always如果你需要这个功能。
  • 尽管此示例完成了这项工作,但它不是幂等的:图像的更改将导致两次 playbook 运行之间的更改,尽管您的 playbook 或变量中没有任何修改。处理此问题的一种方法是制作 pull带有变量的参数动态,您将在命令行上用作额外的变量:

  •   - 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 运行它会:
  • 拉取最新的镜像,如果不存在则创建一个容器。
  • 如果可用,则获取新版本的镜像,并在需要时使用新镜像重新启动容器。
  • 如果容器存在并且没有可用的新图像,则不执行任何操作(报告 ok)。
  • 关于docker - 我的剧本没有下载具有相同标签名称的更新图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55429231/

    相关文章:

    docker - 如何确保始终连接到相同的Docker容器?

    docker - 如何防止重定向的docker端口向外界开放?

    authentication - Jenkins CLI 身份验证

    python - 使用 Jenkins 中的管道执行 pytest

    ansible - 你需要 root 才能执行 - ansible

    docker - docker run命令输出

    linux - MySQL将不会开始使用Dockerfile

    maven - 由于缺少执行数据错误而跳过 JaCoCo 执行

    ssh - Ansible 停止通过 ssh 连接到主机

    git - 源代码控制中的 Ansible SSH 私钥?