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

时间:2019-12-15 01:00:22

标签: 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文件并获得在那里定义的所有容器名称的列表,但是我没有找到解析{{1 }}文件在bash中。

yml

在上面的services: db: image: ... container_name: shared-db apache: image: ... container_name: shared-apache 中,我必须获得名称ymlshared-db

3 个答案:

答案 0 :(得分:2)

只要您对杀死以myscript.sh kill开头的任何容器满意,可以使用docker-compose应用于容器的标签来识别目标

要查找所有以docker-compose开始的容器:

docker-compose

所以您可以做一些简单的事情:

docker ps --filter 'label=com.docker.compose.project'

有关更多信息,请参见filtering上的docker ps --filter 'label=com.docker.compose.project' -q | xargs docker kill 文档。

答案 1 :(得分:1)

grep container_name: */docker-compose.yml | awk '{print $3}'

或:

grep container_name: */docker-compose.yml | sed 's/^.*: //'

答案 2 :(得分:1)

只需使用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命令。