Podman 构建过程强制终止时构建容器残留问题
问题描述
先简要描述一下,在构建 Podman
过程中,如果使用 Ctrl + C
强制终止,会使构建中的容器残留在 Podman
中,不仅占用空间还影响无用镜像的删除。
之前多次构建时有强制中断的情况,所以我的问题比较严重才发现,要不然一个两个无法删除的镜像还引不起重视。
我的镜像列表:
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 6b97c9f7f89f 2 days ago 1.67 GB
<none> <none> 37616f79cf88 2 days ago 992 MB
<none> <none> e5028987de23 2 days ago 1.67 GB
<none> <none> 29ebb80d809d 7 days ago 992 MB
<none> <none> 30994a0dd3f6 7 days ago 1.67 GB
<none> <none> eea90f9d3610 7 days ago 992 MB
<none> <none> e2f2eb80c593 7 days ago 1.67 GB
<none> <none> 339be923556e 7 days ago 930 MB
<none> <none> bc390bc57574 8 days ago 930 MB
docker.io/library/golang 1.18.4 e3c0472b1b62 4 weeks ago 988 MB
<none> <none> 57e0342b3532 5 weeks ago 991 MB
<none> <none> 8b5845455f80 5 weeks ago 1.67 GB
<none> <none> 803d3146f7dd 7 weeks ago 1 GB
docker.io/library/alpine latest e66264b98777 2 months ago 5.82 MB
docker.io/library/golang 1.17.5 276895edf967 7 months ago 963 MB
docker.io/library/node 16.13.0 5964aa70c11d 9 months ago 928 MB
当使用 podman image prune
删除无用镜像时,依旧剩余如上镜像,这时就想到删除单个镜像,如下删除列表中的第一个镜像:
podman rmi 6b97c9f7f89f
此时会报错:
Error: 1 errors occurred:
* Image used by b63f5d5c99dd8bbb17510f58a9dfa2fe5b3a71ba57257aec6aa53c1ec4366db8: image is in use by a container
但这个容器使用 pdoman ps -a
查看并不存在。
经过一番搜索发现,使用 podman ps --all --storage
可以查询当前存储的容器和镜像,其中就包含了构建过程中因强制终止而遗留的容器,如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f735cc1062a7 docker.io/library/golang:1.17.5 buildah 7 weeks ago storage golang-working-container
fe95fad6d0ec docker.io/library/98ee13c4afe4a5a88fb6e3464a90ea3838e62806e9e5e025bedaaae2db25c653-tmp:latest buildah 7 weeks ago storage 8e860db1f8ded07d0d7083ee05ab5c17a7d41519b04ef3127bd3921f8b3df6ff-working-containerbf7d43b6e1de docker.io/library/b1d4f01a06501868672f31dee8be2506c18dbe938a0a12a2edb1e99fb1cb0b1d-tmp:latest buildah 7 weeks ago storage 803d3146f7ddce32b8f2e9f4f9ec7d51607f5b3ddc618758aa55634d0aa1576e-working-containere5fba2ea7216 docker.io/library/golang:1.17.5 buildah 7 weeks ago storage golang-working-container-1
7b94635d2311 docker.io/library/98ee13c4afe4a5a88fb6e3464a90ea3838e62806e9e5e025bedaaae2db25c653-tmp:latest buildah 7 weeks ago storage 8e860db1f8ded07d0d7083ee05ab5c17a7d41519b04ef3127bd3921f8b3df6ff-working-container-1
3297183ec5dd docker.io/library/b1d4f01a06501868672f31dee8be2506c18dbe938a0a12a2edb1e99fb1cb0b1d-tmp:latest buildah 7 weeks ago storage 803d3146f7ddce32b8f2e9f4f9ec7d51607f5b3ddc618758aa55634d0aa1576e-working-container-1
# 后面还有非常多的项目,我们只列举了一部分。
现在的任务就是如何解决这些垃圾数据了。
解决方法
因为 Podman
只是一个容器管理工具,它的是使用 buildah
来构建镜像的,所以我们可以直接使用 buildah
来清理构建过程中残留的容器,使用方法如下:
buildah rm --all
该方法不会删除 podman iamges
中可以查询到的镜像,因为这些构建好的镜像是交给 podman
了的,所以可以放心地删除。