Я пытался выяснить, каков правильный рабочий процесс 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
. state: present
только проверяет, существует ли изображение, а не обновлено ли оно. Это означает, что даже если Dockerfile
изменился, изображение не будет восстановлено. docker_image
предлагает опцию force: yes
, но это всегда воссоздает изображение независимо от того, было ли изменение в Dockerfile
. Когда используется force: yes
, для меня имеет смысл всегда создавать заново контейнеры, работающие с изображением, чтобы они не указывали на висячие изображения Docker.
Чего мне не хватает? Есть ли лучшая альтернатива?