【问题标题】:Docker for Windows "Already exists" image does not exist at allDocker for Windows“已经存在”镜像根本不存在
【发布时间】:2017-08-04 03:14:16
【问题描述】:

我正在尝试拉取一个也应该拉取 aspnet:4.7 图像的图像。然而 docker 一直告诉我图像“已经存在”,但事实并非如此。有没有办法告诉 Docker for Windows 无论如何都要拉取所需的图像?

PS C:\WINDOWS\system32> docker pull -a [hidden]/mycode
dev: Pulling from [hidden]/mycode
3889bb8d808b: Already exists
e29afd68a947: Already exists
36f010181129: Already exists
94c1c860b007: Already exists
d8096eabbf13: Already exists
67025ded22a8: Already exists
dbe75d79f130: Already exists
84d3d4630614: Already exists
301ba58699fa: Already exists
5e9f3c14f629: Already exists
90fd39402ca5: Already exists
4791db5edc55: Pull complete
1da86da74a58: Pull complete
3acc18896b8f: Pull complete
Digest: sha256:dc7e28154e63d5c22a210c314b4a80dcdba7baeea0ebf853445853680276293d
prod: Pulling from [hidden]/mycode
3889bb8d808b: Already exists
e29afd68a947: Already exists
36f010181129: Already exists
94c1c860b007: Already exists
d8096eabbf13: Already exists
67025ded22a8: Already exists
dbe75d79f130: Already exists
84d3d4630614: Already exists
301ba58699fa: Already exists
5e9f3c14f629: Already exists
a1fa39b61ce3: Already exists
98fa6868a880: Pull complete
10db2dd5f47b: Pull complete
5c881ba7245b: Pull complete
Digest: sha256:8b0464fe849148f4fb3c8e165cc7539823d974171bdb596bed48dd91bd9da20d
Status: Downloaded newer image for brunofvalli/xehub
PS C:\WINDOWS\system32> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
[hidden]/mycode  dev                 6e8a0b8dd5f9        24 hours ago        11.8GB
[hidden]/mycode   prod                98a5df79a3ce        24 hours ago        11.8GB
PS C:\WINDOWS\system32>

我已经尝试过

docker rmi 3889bb8d808b

但它告诉我图像不存在。

如何删除这些缓存的图像?或者我如何强制 Docker 下载图像?

编辑 我想我应该从这个问题开始。 microsoft/aspnet:4.7 层/图像的大小约为 4GB。目前,当我尝试使用此层/图像构建我的应用程序时,它失败了,我的猜测是它已损坏,因为在另一台机器上工作正常。我想重新获取这个基础镜像,但是做 docker rmi 并没有从我的系统中删除这个“缓存”的镜像/层,所以我得到了这个 Already exists 消息。我想再次重新下载 4GB 映像。有没有办法做到这一点?我非常接近重新安装 Windows 10。

【问题讨论】:

    标签: docker docker-machine


    【解决方案1】:

    我认为您将图层与图像混淆了。 Docker 镜像是使用 dockerfile 构建的。 dockerfile 中的每一行都会添加一个构成图像的层。例如,从下面的示例中获取基本的 dockerfile 和层标识符:

    FROM busybox:latest # ----> 3889bb8d808b
    MAINTAINER person # ----> e29afd68a947
    RUN touch foo.txt # ----> 36f010181129
    CMD ["bin/sh"] # ------> 94c1c860b007
    

    这将创建一个 docker 镜像,dockerfile 中的每一行构成 docker 镜像中的一个层。因此,第一行将构成一层基础图像busybox:latest,标识符为3889bb8d808b。随后,在对应于 dockerfile 行的前一层之上添加更多层。这真的很有帮助,尤其是当我们对 docker 文件进行更改时,更改的行将触发构建图像的速度非常快,因为仅与该行对应的层就会被拉动。

    同样重要的是要注意,如果您的机器中已经存在某个层作为其他 docker 映像的一部分,则可以直接使用它,而无需每次都再次拉取相同的层。因此,在您的情况下,说已经存在的层可能是在其他图像中较早拉取的层,甚至是您刚刚在稍后阶段更新 dockerfile 的同一图像,因此触发层拉取仅对应于更改的行。

    因此,当您尝试docker rmi 3889bb8d808b docker 时,正确地说该图像不存在。由于3889bb8d808b 标识符对应于层而不是 docker 图像。

    如果你想拉新的 docker 镜像,使用docker images 找到你的 Docker 镜像对应的镜像 ID 并使用docker rmi <image-ID> 删除它。然后使用docker pull -a brunofvalli/xehub

    【讨论】:

    • 非常感谢您的解释。我认为是我的 Windows 大脑想要获得一个全新的层次。如果我删除所有图像并进行拉取,我仍然会得到“已经存在”我什至尝试卸载 docker 并重新安装它仍然给我这个“已经存在”问题。有没有办法删除这些图层?它不会被 rmi 命令删除。
    • 图片很新鲜。 Docker 从远程验证层 ID。并且图像的每一层都有一个唯一的 ID。而如果layer ID保持不变,那么docker就认为image layer没有变化。
    • 即便如此,难道没有办法清除图层缓存吗?
    【解决方案2】:

    不需要删除缓存,docker 已经在下载更新的镜像了。图像是分部分构建的,这些部分称为层。

    当图像发生变化时,大部分图层都会发生变化。所以如果 docker 说这个镜像已经存在也没关系。 docker 的实际意思是,那个特定的 layer 已经存在并且在远程位置没有改变。


    编辑:

    对于 Linux 用户:

    如果您想查看图像数据的存储位置,可以访问/var/lib/docker/image/aufs。在那里你会找到imagedb 和layerdb

    对于 Windows 用户:

    /var/lib/docker 挂载在C:\Users\Public\Documents\Hyper-V\Virtual hard disks 下的 VM 的永久虚拟磁盘上。欲了解更多信息,请参阅here。那里的讨论是关于图像的存储位置以及如何更改默认位置。

    【讨论】:

    • 我正在使用 Docker for Windows,Windows 的路径是什么?
    • /var/lib/docker 挂载在C:\Users\Public\Documents\Hyper-V\Virtual hard disks 下的VM 的永久虚拟磁盘上:Source
    • 这也适用于 Windows 容器吗?
    • @CBBSpike 我已经更新了答案。 windows上运行的容器存储在hyper-v中,更多信息可以参考答案中的链接。
    【解决方案3】:

    无法完成这项工作。 决定重新安装 Windows :( 希望这个错误不会再次出现。

    【讨论】:

      【解决方案4】:

      docker 在 docker 仪表板上有一个解决方案,只需按下下面的按钮,它就可以工作了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 2019-05-01
        • 2020-10-31
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        相关资源
        最近更新 更多