Мне нужно запустить команду для нескольких запущенных контейнеров. Например, предположим, что моему приложению необходимо выполнить обновление структуры данных для базы данных после получения обновлений кода. Чтобы сделать это, мы хотим запустить docker build <project_dir> -t latest
, затем docker stop; docker rm; docker run
. На этом этапе мы можем предположить, что обновили основной код контейнера, но нам все равно нужно запустить это обновление базы данных с помощью собственного инструментария приложения.
По сути, мне нужен какой-то способ получить список запущенных контейнеров, отфильтрованных по некоторым критериям, и зарегистрировать эти идентификаторы контейнеров в Ansible. Затем для каждого контейнера мы запускаем команду.
Подобный этому:
- name: Get list of running containers docker: image: my-image:latest state: running register: container_ids
Эта задача сохранит список запущенных контейнеров, которые используют my-image:latest
к container_ids
. Затем мы выполняем команду:
- name: Exec the database update cmd: "docker exec -it {{ item }} my-app-db-update.sh" with: container_ids
Поскольку мы на самом деле не хотим использовать активные контейнеры для такого типа операций, лучшим вариантом было бы запустить вместо этого новый одноразовый контейнер, работающий с теми же данными:
- name: Run the database update cmd: "docker run --rm --volumes-from {{ item }} --link:mydb:db my-app sh -c 'my-app-db-update.sh'" with: container_ids
Приведенное выше - всего лишь псевдокод, на самом деле он не будет выполняться. Как мне выполнить задачу сохранения списка запущенных контейнеров docker, которые соответствуют определенным критериям, чтобы затем я мог применить команду к каждому контейнеру в списке, используя либо docker exec
или docker run
?
В Интернете на удивление мало информации об этом.