我正在构建docker映像,作为自动构建的一部分,我想删除我创建的图像以及与该生成的图像相关的所有后续图像。
我可以通过指定名称和标签轻松删除构建的图像(因为我可以通过变量获取此数据)。但是,如何删除Dockerfile引入的所有其他映像? (特别使用FROM
关键字,因为单个Dockerfile中可以有多个FROM
调用。)
例如,我有一个镜像将python:2.7.16-alpine
插入其Dockerfile中。如果我从系统上没有图像开始,运行docker build -f path/to/Dockerfile
会给我留下两个图像:generated-docker-image:tag
和python:2.7.16-alpine
。
假设该进程在可能要删除其他docker映像的系统上运行,那么如何以编程方式仅删除我的映像及其关联的映像?
答案 0 :(得分:0)
我认为您可以使用docker history
(显示图像的历史记录)来查找与最后一张图像相关的所有图像。我想通知您,该解决方案不适用于多阶段构建,因为最终图像仅引用了作为其基础层的图像。
让我给你看一些例子:
1。。我们创建一个简单的Dockerfile
:
FROM ubuntu:latest
RUN touch newfile
2。。我们从中构建一个docker映像:
$ docker build -t new-image .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM ubuntu:latest
latest: Pulling from library/ubuntu
898c46f3b1a1: Pull complete
63366dfa0a50: Pull complete
041d4cd74a92: Pull complete
6e1bee0f8701: Pull complete
Digest: sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
Status: Downloaded newer image for ubuntu:latest
---> 94e814e2efa8
Step 2/2 : RUN touch newfile
---> Running in ac93702f363b
Removing intermediate container ac93702f363b
---> 4d52ac122761
Successfully built 4d52ac122761
Successfully tagged new-image:latest
3。现在,我们可以清除用于构建最终图像的所有图像:
$ docker history new-image:latest | awk '!/IMAGE|<missing>/ {print $1}' | xargs -I {} docker rmi {}
Untagged: new-image:latest
Deleted: sha256:4d52ac122761ec1ba9f3d77606c49f98cf8c7d728d60834a87f25cede39a2027
Deleted: sha256:7f62b9533dbd6514fe0cb7f4ddc3086ad5ae45fe1c13f5eeea1cc38f575e92bd
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
Deleted: sha256:94e814e2efa8845d95b2112d54497fbad173e45121ce9255b93401392f538499
Deleted: sha256:e783d8ee44ce099d51cbe699f699a04e43c9af445d85d8576f0172ba92e4e16c
Deleted: sha256:cc7fae10c2d465c5e4b95167987eaa53ae01a13df6894493efc5b28b95c1bba2
Deleted: sha256:99fc3504db138523ca958c0c1887dd5e8b59f8104fbd6fd4eed485c3e25d2446
Deleted: sha256:762d8e1a60542b83df67c13ec0d75517e5104dee84d8aa7fe5401113f89854d9