从名称动态获取Docker映像ID

时间:2018-11-07 14:43:54

标签: bash docker

我需要动态删除服务器中的所有docker映像,但postgres映像和容器除外。

现在,我需要一种动态方式来获取该docker映像的ID,这样我就可以避免使用:

docker rmi $(docker images -q | grep -v $<id_of_postgres_container>)

对于容器部分,我设法找到了它:

docker ps -aqf "name=postgres"

仅返回postgres容器的ID。有什么方法可以对图像做同样的事情而又不会太深入bash脚本?

或其他更好的建议?

3 个答案:

答案 0 :(得分:4)

docker images --format="{{.Repository}} {{.ID}}" | 
grep "^postgres " | 
cut -d' ' -f2

获取格式为repository<space>id的docker镜像,然后过滤以postgres<space>开头的行,然后仅保留id。

docker images --format="{{.Repository}} {{.ID}}" | 
grep "^postgres " | 
cut -d' ' -f2 | 
xargs docker rmi

但是,如果postgres容器和图像当前正在运行或使用,则可以:

 docker system prune --force --all

答案 1 :(得分:0)

docker rmi将永远不会删除与正在运行的容器相对应的图像。因此,如果您有一个基于postgres运行的容器,并且想要删除系统上的所有其他映像,那么古老的咒语将满足您的要求;我对于docker system来说太老了,但是我知道“获取所有图像ID,然后尝试全部删除它们”

docker images -q | xargs docker rmi

这将打印出一些错误,但会删除所有可以的图像。

答案 2 :(得分:0)

你可以使用:

$ docker images -q [image_name]

其中 image_name 可以包含标签(附加在 : 之后)、带有 / 的注册表用户名(如果适用)等

必须下载图像才能工作,例如:

$ docker pull hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
$ docker images -q hello-world
d1165f221234
$ docker images -q hello-world:latest
d1165f221234

如果图像在本地不可用,我能想到的唯一替代方法是手动查询注册表,例如like this