Возможный рабочий процесс для создания образа Docker и воссоздания контейнера Docker, если изображение было изменено? - PullRequest
0 голосов
/ 07 мая 2018

Я пытался выяснить, каков правильный рабочий процесс 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.

Чего мне не хватает? Есть ли лучшая альтернатива?

1 Ответ

0 голосов
/ 07 мая 2018

Пользователь 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...