Running Docker commands on multiple items
I recently had to delete a number of docker images from my local machine. The command for removing images has the following format:
docker image rm [OPTIONS] <image_id_1> [<image_id_2> <image_id_3 ...]
My initial instinct was to use a file glob, to see if that worked.
docker image rm foo*
However it turns out that you can’t do this. The way to achieve this instead is to use the result of a listing call to generate the required IDs. For example, let’s say you want to remove all images from your machine that started with the word foo
. You can list the images that have a REPOSITORY name that includes the term “foo” with the command:
$ docker images foo*
REPOSITORY TAG IMAGE ID CREATED SIZE
foo_web latest 875f314768f4 5 months ago 123MB
foo_worker latest 12ab875f3147 3 months ago 456MB
The output of the docker images
command is a table by default, but we only want the image IDs so that we can pass them to the docker image rm
command. We can do this with the -q
option:
$ docker images -q foo*
875f314768f4
12ab875f3147
Putting the commands together we get:
$ docker image rm $(docker images -q foo*)
or if you use Fish shell:
# don't include $ before parentheses and quote the glob
$ docker image rm (docker images -q 'foo*')