我一直在使用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_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_container和docker_image的模块文档
更进一步:
restart_policy: always
。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
运行它将:
在安装之前,我通常会删除旧图像作为清理的一部分。您应该首先删除图像,就像删除容器一样。这将迫使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
理想情况下,我们应该使我们的任务/角色具有幂等性(如果反复运行,则跳过重复工作)。因此,我认为使用版本号标记构建并使用部署中的版本号而不是最新版本更为清晰。