我可以通过名字找到一个docker容器:docker ps --filter='name=mvn_repo'.有没有办法(不使用bash/awk/grep等)来否定这个过滤器并列出除了具有给定名称的容器之外的所有容器?
您可以使用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匹配)." 如果我放一个空行,则格式化将丢失.
我来到这里试图找出类似的问题......在 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)
可以使用以下命令:
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。| 归档时间: |
|
| 查看次数: |
5052 次 |
| 最近记录: |