Tian Jiale's Blog

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 了的,所以可以放心地删除。