Как запустить специальные команды составления докера в Ansible?

Я должен запустить несколько docker-compose run команды для моего проекта веб-приложения Phoenix. Из терминала я должен запустить это:

$ sudo docker-compose run web mix do deps.get, compile

$ sudo docker-compose run web mix ecto.create

$ sudo docker-compose run web mix ecto.migrate

Хотя это работает нормально, я хотел бы автоматизировать его с помощью Ansible. Я хорошо знаю, что есть модуль docker_service Ansible, который использует API docker-compose, и я также знаю о definition опция, которая облегчает скрытую интеграцию конфигурации внутри docker-compose.yml в мою книгу игр. Что я не знаю, так это как я могу убедиться, что приведенные выше команды будут выполняться перед запуском контейнеров. Кто-нибудь может мне помочь с этим вопросом?

1 ответ

Я столкнулся с подобной ситуацией, подобной вашей, и не нашел способа запуска команд запуска docker-compose через выделенные модули docker для Ansible. Однако я прекратил использовать модуль оболочки Ansible с успехом для моих целей. Здесь у нас есть несколько примеров, адаптированных к вашей ситуации.

Один за другим, явный способ

- name: Run mix deps.get and compile
  shell: docker-compose run web mix do deps.get, compile
  args:
    chdir: /path/to/directory/having/your/docker-compose.yml
  become: True # because you're using sudo

- name: Run mix ecto.create
  shell: docker-compose run web mix ecto.create
  args:
    chdir: /path/to/directory/having/your/docker-compose.yml
  become: True

- name: Run mix ecto.migrate
  shell: docker-compose run web mix ecto.migrate
  args:
    chdir: /path/to/directory/having/your/docker-compose.yml
  become: True

Эквивалентный способ, но короче

- name: Run mix commands
  shell: docker-compose run web mix "{{ item }}"
  args:
    chdir: /path/to/directory/having/your/docker-compose.yml
  loop:
    - "do deps.get, compile"
    - "ecto.create"
    - "ecto.migrate"
  become: True

Чтобы выполнить эти команды перед запуском других контейнеров, определенных в docker-compose.yml файл, может быть, комбинация этих пунктов может помочь:

  • Используйте тома Docker для сохранения результатов получения зависимостей, компиляции и команд Ecto
  • Использовать depends_on вариант конфигурации внутри docker-compose.yml файл
  • Использовать service параметр модуля docker_service Ansible в вашей книге воспроизведения, чтобы запустить только подмножество контейнеров
  • Используйте одноразовые контейнеры с вашим docker-compose run команды, через --rm вариант и, возможно, с --no-deps вариант
  • В вашей пьесе, выполните ваши docker-compose run команды перед docker_service задача

Некоторые заметки:

  • Я использую Ansible 2.5 на момент написания этого ответа.
  • Я предполагаю, что бинарный файл docker-compose уже установлен, он работает нормально и доступен в стандартной системе PATH на управляемом хосте.
  • docker-compose.yml файл уже существует и имеет путь /path/to/directory/having/your/docker-compose.yml, как используется в примерах. Можно также использовать переменную для этого пути к файлу.

Это оно!

Другие вопросы по тегам