我正在使用docker从docker文件构建映像。在此过程中,发生了一些错误,因此构建退出并显示错误代码。
跑步时,docker images
我可以看到未加标签的图像。所以我试图将其删除docker rmi xxxxx
。但是它总是失败,它说无法删除图像,因为它已被停止的容器使用。
所以我更深入一点。我运行docker ps -a
,现在可以看到一长串的停止容器,这些容器是在构建过程失败时创建的。
为什么会有容器创建?我认为图像就像编程中“类”的概念,容器是类的实例。在成功构建映像之前,为什么要创建实例?没有所有那些停止的容器,如何构建映像?
Dockerfile的每一行都会创建一个中间容器,以执行该行的Dockerfile指令。
如果指令成功执行,则将创建一个中间映像,该映像将作为下一个要启动的容器(执行Dockerfile的下一行)的基础。
如果该指令失败,则可能使容器处于“已退出”状态,从而将阻止从中创建该容器的中间映像。
只需清除所有容器,然后清除所有图像,然后重试。
如果您尝试重复构建Dockerfile,那么最终会得到一系列中间映像和容器。
这就是为什么当我的构建(最终)成功时,我总是在构建脚本中清理额外的容器,图像和(使用docker 1.10+)卷:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句