bash - Bash:从docker-compose.yml获取容器名称列表

标签 bash shell docker docker-compose

我的容器分散在多个docker-compose.yml文件(https://docs.docker.com/compose/extends/)中。它们根据项目是分开的,但是所有项目都使用几个容器。我有一个简洁的shell脚本,可以让我轻松地一次启动几个项目:

./myscript.sh up project1 project2

执行:
docker-compose up -d -f shared/docker-compose.yml -f project1/docker-compose.yml -f project2/docker-compose.yml project1 project2

这将启动project1project2容器以及在共享撰写文件中定义的一些容器,例如shared-dbshared-apache

现在,我想在 shell 脚本中添加杀死容器的选项:
./myscript.sh kill

应该执行:
docker kill project1 project2 shared-db shared-apache

问题是获取我的容器列表。我当前的方法是使用docker ps --format '{{.Names}}',这并不理想,因为它还可以列出不属于这些项目的容器。

我也尝试过使用docker-compose kill,它需要分别为每个docker-compose.yml文件执行。我遍历了所有文件,它对第一个文件有效,但对第二个文件抛出错误:
ERROR: Service 'project1' depends on service 'shared-db' which is undefined.

引发该错误是因为project1/docker-compose.yml具有与shared/docker-compose.yml的依赖关系,并且由于shared已被杀死而未被满足。

想到的唯一方法就是以某种方式遍历所有docker-compose.yml文件并获得在那里定义的所有容器名称的列表,但是我没有找到任何适当的方法来解析bash中的yml文件。
services:
  db:
    image: ...
    container_name: shared-db

  apache:
    image: ...
    container_name: shared-apache

从上面的yml中,我必须获得名称shared-dbshared-apache

最佳答案

只需使用docker-compose kill:

docker-compose -f shared/docker-compose.yml -f project1/docker-compose.yml -f project2/docker-compose.yml kill

选项-f应该位于docker-compose的命令之前,这样它将被解析为包含文件。您可以通过这种方式使用所有可能的docker-compose命令。

关于bash - Bash:从docker-compose.yml获取容器名称列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59340426/

相关文章:

bash 脚本 : build a command then execute

linux - 使用 grep 提取日志文件中字符串的计数

docker - 如何退出 docker ?

mysql - 如何等待导入sql文件?

azure - 如何在Azure的Ubuntu虚拟机中将http端口重定向到Docker

bash - 如何从 shell 脚本创建和访问 shell 配置文件?

bash - 为什么 $@ 与 bash 中的大多数其他变量不同?

bash - 如何逐行使用 sed?

linux - 不会分配伪终端错误,因为标准输入不是终端 - sudo

linux - 从 shell 脚本传递日期到查询