Как запустить специальные команды составления докера в 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
, как используется в примерах. Можно также использовать переменную для этого пути к файлу.
Это оно!