从输出中获取ID列表,但最新ID除外

时间:2019-08-19 09:55:17

标签: bash docker

~$ docker images --filter=reference="*test-*" --format 'table {{.Repository}}\t{{.CreatedAt}}\t{{.ID}}'

REPOSITORY          CREATED AT                      IMAGE ID
mop-test-image      2019-08-19 09:18:09 +0000 UTC   a16fc65f4d19
mop-test-image      2019-08-19 09:14:11 +0000 UTC   d6a3377f609a
mop-test-image      2019-08-19 09:09:02 +0000 UTC   992aef1d798f
mop-test-image      2019-08-19 09:01:43 +0000 UTC   132bc17ea5cb
mop-test-image      2019-08-19 08:55:59 +0000 UTC   9dfa73010b19

一个人如何获得除上一个(最近创建的一个)以外的所有图像ID。换句话说,此列表:

d6a3377f609a
992aef1d798f
132bc17ea5cb
9dfa73010b19

ID号将随时间变化。因此,将它们包含在答案中是行不通的。它必须依靠CREATED AT,它也会随着时间而变化。

4 个答案:

答案 0 :(得分:1)

使用before过滤器

docker rmi -f $(docker images --filter=reference="*test-*" --filter before=a16fc65f4d19 -q)

或用于自动查找并删除它们:

docker rmi -f $(docker images  --filter=reference="*test-*" --filter before=`docker images --filter=reference="*test-*" --format '{{.ID}}' | head -1` -q)

如果第二张命令中的最新图像未包含在参考“其他图像”中,则您需要在第二个命令中包含两次--filter=reference="*test-*"

答案 1 :(得分:1)

要仅获取docker映像ID,请使用:

docker images --format '{{.ID}}'

并获取除前一个用途外的所有值:

docker images --format '{{.ID}}' | sed '1d'

答案 2 :(得分:0)

通过docker images命令将awk的输出插入类似这样的内容吗?

awk 'NR > 2 { print $6 }'

所以

docker images --filter=reference="*test-*" --format 'table {{.Repository}}\t{{.CreatedAt}}\t{{.ID}}' | awk 'NR > 2 { print $6 }'

答案 3 :(得分:0)

docker images --format '{{.CreatedAt}}\t{{.ID}}' | sort | cut -f2

这里的sort很棘手。因为恰好假设每个日期都在相同的时区中,所以我们可以按字典顺序对列表进行排序并获得正确的日期顺序。然后,我删除日期并仅打印ID。

现在“除了最上面的部分”部分,只需将其通过管道传输到tail -n+2

如果没有它,我将把日期转换为Unix纪元日期,对其进行排序,然后进行cut

docker images --format '{{.CreatedAt}}\n{{.ID}}' | 
xargs -d$'\n' -n2 bash -c 'printf "%s\t%s\n" "$(date -d "${1//UTC}" +%s)" "$2"' -- | sort -n | cut -f2

要使Docker的日期分别为date,我只删除了UTC后缀,它就起作用了。