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

Myk*_*rov 10 docker

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

use*_*097 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在码头工检查中的参考文章

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

并且,正如他所说的那样

"(不幸的是,Docker为每个容器打印一个新行,无论它是否与if匹配)." 如果我放一个空行,则格式化将丢失.


aug*_*rar 6

有没有一种方法(不诉诸 bash/awk/grep 等)来否定此过滤器并列出除给定名称的容器之外的所有容器?

Docker命令行参考没有提到执行此操作的方法。因此,我得出结论,Docker CLI 目前不支持否定过滤器。

  • 如果问题是“Docker 命令行界面是否支持 docker ps 的否定过滤器?”,这将是正确答案。但这不是OP所要求的。所以你会因为没有回答问题而被否决。OP 问他怎么能做到这一点。而且有很多方法可以实现他想要的。 (3认同)
  • 不知道为什么这会被否决,这在当时并且仍然是问题的正确答案。问:是否支持否定过滤器?答:没有。 (2认同)

Jim*_*Jim 6

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

docker ps -aq | grep -v -E $(docker ps -aq --filter='name=mvn_repo' | paste -sd "|" -)
Run Code Online (Sandbox Code Playgroud)

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

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

为了打破它...

docker ps -aq --filter='name=mvn_repo' | paste -sd "|" -
Run Code Online (Sandbox Code Playgroud)

产生这样的输出:

d5b377495a58|2af19e0029a4
Run Code Online (Sandbox Code Playgroud)

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

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

grep -v -E $(docker ps -aq --filter='name=mvn_repo' | paste -sd "|" -)
Run Code Online (Sandbox Code Playgroud)

解决了这样的事情:

grep -v -E d5b377495a58|2af19e0029a4
Run Code Online (Sandbox Code Playgroud)

那么当我们可以通过管道输出的时候docker ps -aq得到这样的东西:

docker ps -aq | grep -v -E d5b377495a58|2af19e0029a4
Run Code Online (Sandbox Code Playgroud)


Max*_*lov 5

可以使用以下命令:

comm -2 -3 <(docker ps -aq | sort) <(docker ps -aq --filter='name=mvn_repo' | sort)
Run Code Online (Sandbox Code Playgroud)

代码如何工作的解释:

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