如何搜索与" docker ps --filter"?的结果不匹配的容器

时间:2015-08-12 08:09:34

标签: docker

我可以按名称找到一个docker容器:docker ps --filter='name=mvn_repo'。有没有办法(不使用bash / awk / grep等)来否定这个过滤器并列出除了具有给定名称的容器之外的所有容器?

4 个答案:

答案 0 :(得分:7)

您可以使用docker inspect执行此操作,我使用--name = test111创建了一个容器,它显示为/ test111,所以如果我这样做

docker inspect -f '{{if ne "test111" .Name }}{{.Name}} {{ end }}' $(docker ps -q) /test111 /sezs /jolly_galileo /distracted_mestorf /cranky_nobel /goofy_turing /modest_brown /serene_wright /fervent_lalande

但是如果我使用/来做过滤器,那么它就成了

docker inspect -f '{{if ne "/test111" .Name }}{{.Name}} {{ end }}' $(docker ps -q) /sezs /jolly_galileo /distracted_mestorf /cranky_nobel /goofy_turing /modest_brown /serene_wright /fervent_lalande

我不明白。

感谢Adrian Mouat在docker inspect上的参考文章

http://container-solutions.com/docker-inspect-template-magic/

而且,正如他所说的

“(不幸的是,Docker为每个容器打印一个新行,无论它是否与if匹配)。” 如果我放一个空行,格式就会丢失。

答案 1 :(得分:3)

Facebook Content Sharing Best Practices并未提及实现此目的的方法。因此,我得出结论,Docker CLI目前不支持否定过滤器。

答案 2 :(得分:2)

我来到这里试图找出一个类似的问题......在Mykola Gurov的评论中找到了解决方案的一部分,我修改了这个问题:

docker ps -aq | grep -v -E $(docker ps -aq --filter='name=mvn_repo' | paste -sd "|" -)

Mykola的解决方案仅在与docker ps过滤器匹配时才有效。因此,如果您有一大堆容器要排除匹配过滤器模式 - 它将失败,因为grep只能处理单个表达式。

我提供的解决方案将其输出转换为正则表达式,然后将grep与扩展的正则表达式一起使用。

要分解......

docker ps -aq --filter='name=mvn_repo' | paste -sd "|" -

产生如下输出:

d5b377495a58|2af19e0029a4

这是每个容器id与|字符连接的结果,用于表示可以与grep一起使用的正则表达式。

然后在像grep这样的子shell中使用时使用

grep -v -E $(docker ps -aq --filter='name=mvn_repo' | paste -sd "|" -)

解决了这样的事情:

grep -v -E d5b377495a58|2af19e0029a4

然后我们可以管道docker ps -aq的输出来得到这样的东西:

docker ps -aq | grep -v -E d5b377495a58|2af19e0029a4

答案 3 :(得分:0)

可以使用以下命令:

comm -2 -3 <(docker ps -aq | sort) <(docker ps -aq --filter='name=mvn_repo' | sort)

说明代码的工作方式:

  • docker ps -aq显示所有正在运行的容器的列表
  • docker ps -aq --filter='name=mvn_repo'显示了经过排序的容器过滤列表
  • comm -2 -3 <(... | sort) <(... | sort)获取已排序的列表,并向第一个列表(正在运行的容器)提供 unique 行。有关comm的更多详细信息,请参见man comm