根据标签过滤要清理的镜像
在最后这一步,我们将探索 docker image prune
的另一个强大过滤选项:基于标签进行过滤。标签是可以附加到 Docker 对象(包括镜像)上的键值对,用于添加元数据。然后,你可以使用这些标签来过滤和管理你的 Docker 资源。
使用 label
键的 --filter
标志允许你根据镜像的标签指定在清理过程中要包含或排除哪些镜像。
首先,让我们创建几个带有不同标签的镜像。我们将使用一个简单的 Dockerfile 并构建两个带有不同标签的镜像。
在你的 ~/project
目录中创建一个名为 Dockerfile.labeled
的文件,内容如下:
FROM alpine:latest
LABEL environment="development"
LABEL version="1.0"
RUN echo "This is a labeled image" >/app/info.txt
现在,从这个 Dockerfile 构建两个镜像,在构建过程中使用 --label
标志应用不同的标签。
docker build -t my-labeled-app:dev --label project=myapp --label stage=dev ~/project -f Dockerfile.labeled
docker build -t my-labeled-app:prod --label project=myapp --label stage=prod ~/project -f Dockerfile.labeled
现在我们已经构建了两个镜像,my-labeled-app:dev
和 my-labeled-app:prod
,它们都基于同一个 Dockerfile,但具有不同的 stage
标签。
让我们列出这些镜像并检查它们的标签。
docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"
你应该会看到显示镜像及其关联标签的输出。
现在,让我们使用 docker image prune
根据镜像的标签来删除镜像。假设我们要删除所有带有 stage=dev
标签的未使用镜像。我们可以使用带有 label=stage=dev
的 --filter
标志。我们还将使用 -a
标志来考虑所有未使用的镜像,而不仅仅是悬空镜像。
docker image prune -a --filter "label=stage=dev"
Docker 会显示符合过滤条件并将被删除的镜像。输入 y
进行确认。
清理完成后,再次列出镜像:
docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"
你应该会看到 my-labeled-app:dev
镜像已被删除,而 my-labeled-app:prod
仍然存在,因为它不符合过滤条件。
你还可以使用 label!=key=value
语法来删除 不 具有特定标签或标签值的镜像。例如,要删除所有 不 具有 stage=prod
标签的未使用镜像:
docker image prune -a --filter "label!=stage=prod"
这个命令将删除 my-labeled-app:dev
(如果它仍然存在)以及任何其他不具有 stage=prod
标签的未使用镜像。
根据标签进行过滤提供了一种灵活的方式,可根据你自己定义的元数据来管理和清理你的镜像。