[英]Ansible workflow for building Docker image and recreating Docker container if image was changed?
我一直在努力弄清楚正確的Ansible工作流程是什么,用於部署Docker映像,如果映像已更改,則重新創建Docker容器。
這是我最初認為可以工作的角色的任務列表:
- name: Deploy Source
synchronize:
archive: yes
checksum: yes
compress: yes
dest: '/tmp/{{ app_name }}'
src: ./
- name: Build Docker Image
docker_image:
name: '{{ docker_image_name }}'
path: '/tmp/{{ app_name }}'
rm: yes
state: present
register: build_docker_image
- name: Create Docker Container
docker_container:
image: '{{ docker_image_name }}'
keep_volumes: yes
name: '{{ docker_container_name }}'
recreate: '{{ true if build_docker_image.changed else omit }}'
state: started
這不起作用,因為Ansible docker_image
模塊未提供state: latest
docker_image
選項。 state: present
僅檢查圖像是否存在,而不檢查圖像是否最新。 這意味着即使Dockerfile
已更改,該映像也不會重建。 docker_image
確實提供了force: yes
選項,但這將始終重新創建映像,而不管Dockerfile
是否發生了變化。 當使用force: yes
,對我來說有意義的是,總是重新創建運行該映像的容器,以防止它們指向懸空的Docker映像,這是更好的選擇。
我想念什么? 有更好的選擇嗎?
viggeh用戶在Ansible GitHub上提供了一種變通方法 ,我已根據需要對其進行了調整,如下所示:
- name: Deploy Source
synchronize:
archive: yes
checksum: yes
compress: yes
dest: '/tmp/{{ app_name }}'
src: ./
- name: Get Existing Image ID
command: 'docker images --format {% raw %}"{{.ID}}"{% endraw %} --no-trunc {{ docker_image_name }}:{{ docker_image_tag }}'
register: image_id
changed_when: image_id.rc != 0
- name: Build Docker Image
docker_image:
force: yes
name: '{{ docker_image_name }}'
path: '/tmp/{{ app_name }}'
rm: yes
state: present
tag: '{{ docker_image_tag }}'
register: image_build
changed_when: image_id.stdout != image_build.image.Id
- name: Create Docker Container
docker_container:
image: '{{ docker_image_name }}'
keep_volumes: yes
name: '{{ docker_container_name }}'
recreate: '{{ True if image_build.changed else omit }}'
state: started
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.