【问题标题】:Why docker build image from docker file will create container when build exit incorrectly?为什么构建退出时,来自 docker 文件的 docker build 镜像会创建容器?
【发布时间】:2016-08-16 22:47:15
【问题描述】:

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

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

所以我挖得更深一点。我运行docker ps -a,现在我可以看到一长串已停止的容器,这些容器是在构建过程失败时创建的。

为什么会创建容器?我认为图像就像编程中的“类”概念,容器是类的实例。在镜像构建成功之前,为什么还要创建实例呢?在没有所有这些停止的容器的情况下如何构建映像?

【问题讨论】:

    标签: docker docker-image


    【解决方案1】:

    Dockerfile 的每一行都会创建一个中间容器来执行该行的 Dockerfile 指令。

    如果指令成功,将创建一个中间映像,它将作为下一个要启动的容器的基础(执行 Dockerfile 的下一行)

    如果所述指令失败,则可能会使容器处于退出状态,这反过来又会阻止创建它的中间映像。
    只需cleanup all the containers then all the images,然后再试一次。

    如果您尝试重复构建 Dockerfile,最终会得到一组中间图像和容器。

    这就是为什么当我的构建(最终)成功时,我总是在我的build script 中清理额外的容器、图像和(使用 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
    

    【讨论】:

      【解决方案2】:

      构建过程正在为 dockerfile 中的每个步骤创建一个中间件。就像你在这个例子中看到的那样:

      ...
      Removing intermediate container e07079f73a9f
      Step 3 : RUN cd /opt/
       ---> Running in 78d480a57cca
       ---> 324e9006d642
      Removing intermediate container 78d480a57cca
      Step 4 : RUN unzip /opt/mule-ee-distribution-standalone-3.7.3.zip -d /opt/
       ---> Running in 81aa445c770c
      ...
       ---> e702e1cff4ee
       ---> removing intermediate container 81aa445c770c
      

      为了加快构建过程,中间容器将用作缓存。成功构建后,这些容器将被删除,但当您尝试多次构建时,“旧”中间容器和映像仍会在您的系统上。

      如果您希望在构建完成后保留中间容器,则必须使用--rm=false。默认情况下它是true,因此在成功构建后,中间容器将被删除。如果在使用中间容器期间构建失败,则该容器将退出。中间的“此容器的图像”具有标签 <none>:<none> 并且无法正常删除,因为该图像中有一个(兴奋的)容器。您可以使用 -f(强制)标志删除图像:docker rmi -f image-id

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-09
        • 2020-10-06
        • 1970-01-01
        • 2014-05-07
        相关资源
        最近更新 更多