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