为什么docker从docker文件构建映像会在构建退出错误时创建容器?

Aar*_*hen 4 docker docker-image

我正在使用docker从docker文件构建图像.在此过程中发生了一些错误,因此构建退出时出现错误代码.

当我跑步时,docker images我可以看到无标记的图像.所以我试图删除它docker rmi xxxxx.但它总是失败,它说图像无法删除,因为它被停止的容器使用.

所以我深入挖掘一下.我运行docker ps -a,现在我可以看到在构建过程失败时创建的已停止容器的长列表.

为什么会有容器创建?我认为图像就像编程中的"类"概念,而容器是类的实例.在成功构建映像之前,为什么会创建实例?如何在没有所有停止的容器的情况下构建映像?

Von*_*onC 5

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
Run Code Online (Sandbox Code Playgroud)