我正在使用 docker 从 docker 文件构建图像。在此过程中发生了一些错误,因此构建退出并显示错误代码。
当我跑步时docker images
我可以看到未标记的图像。所以我尝试删除它docker rmi xxxxx
。但它总是失败,它说无法删除图像,因为它被停止的容器使用。
所以我更深入地挖掘。我跑docker ps -a
,现在我可以看到构建过程失败时创建的一长串已停止的容器。
为什么会创建容器??我认为图像就像编程中“类”的概念,容器是类的实例。镜像构建成功之前,为什么会创建实例?在没有所有这些停止的容器的情况下,如何构建映像?
Dockerfile 的每一行都会创建一个中间容器来执行该行的 Dockerfile 指令。
如果该指令成功,将创建一个中间映像,该映像将作为下一个要启动的容器的基础(以执行 Dockerfile 的下一行)
如果该指令失败,则可能会使容器处于退出状态,这反过来又会阻止从中创建它的中间图像。
Simply 清理所有容器,然后清理所有图像 https://stackoverflow.com/a/32723127/6309, 然后再试一次。
如果您尝试重复构建 Dockerfile,您最终会得到中间映像和容器的集合。
这就是为什么当我的构建(最终)成功时,我总是清理我的容器中的额外容器、图像和(使用 docker 1.10+)卷。构建脚本 https://github.com/VonC/b2d/blob/master/bin/db#L20-L27:
cmdb="docker build${proxy}${f} -t $1 $2"
# echo "cmdb='${cmdb}"
if eval ${cmdb}; then
docker rm $(docker ps -qa --no-trunc --filter "status=exited" 2>/dev/null) 2>/dev/null
docker rmi $(docker images --filter "dangling=true" -q --no-trunc 2>/dev/null) 2>/dev/null
docker volume rm $(docker volume ls -qf dangling=true 2>/dev/null) 2>/dev/null
exit 0
fi
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)