我需要针对多个正在运行的容器运行一个命令。例如,假设我的应用程序需要在收到代码更新后针对数据库运行数据结构更新。为此,我们要运行docker build <project_dir> -t latest
,然后docker stop; docker rm; docker run
。在这个阶段,我们可以假设我们已经更新了容器的核心代码,但我们仍然需要使用应用程序自己的工具运行该数据库更新。
本质上,我需要某种方法来获取正在运行的容器列表,按某些条件进行过滤,然后将这些容器 ID 注册到 Ansible。然后对于每个容器,我们运行命令。
像这样:
- name: Get list of running containers
docker:
image: my-image:latest
state: running
register: container_ids
Run Code Online (Sandbox Code Playgroud)
此任务将存储使用my-image:latest
to的正在运行的容器列表container_ids
。然后我们执行命令:
- name: Exec the database update
cmd: "docker exec -it {{ item }} my-app-db-update.sh"
with: container_ids
Run Code Online (Sandbox Code Playgroud)
由于我们真的不想将活动容器用于此类操作,因此更好的选择是启动一个新的一次性容器来处理相同的数据:
- 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
Run Code Online (Sandbox Code Playgroud)
以上只是伪代码——它实际上不会运行。如何完成存储满足特定条件的正在运行的 docker 容器列表的任务,以便我可以使用docker …