我一直在使用 jenkins 来构建 docker 镜像,并推送到 docker hub,标签是最新的。 我写了一个 ansible 剧本,它将通过从 docker 中心拉取最新的映像来部署 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_container和docker_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
现在,如果您正常运行剧本,它将:
- 拉取映像(如果不存在)并创建容器(如果尚未运行)
- 不执行任何操作,如果容器已在运行,则报告正常
如果使用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