Docker镜像损坏?移除层?

14

系统重启后,似乎存在的Docker镜像已经损坏。

我尝试了以下操作:

  1. 在该机器上重新构建一个Docker - 这个方法可行。这个镜像正在正常运行。
  2. 拉取一个已经存在的镜像,它说层已经存在。但是这个镜像仍然似乎是损坏的。

我觉得删除这个镜像会有帮助。当我尝试删除时,它似乎只删除了标签,而没有删除所有的层。我该怎么做呢?

我尝试了 docker rmi 命令,镜像被删除了。

现在,我尝试再次拉取这个镜像,但是有些层已经存在了。我试图运行Docker,但显示“oci runtime 错误 ..... 文件未找到”。

这些镜像在其他机器上可以正常工作,并且在这台机器上也一直在工作,直到几个小时前。

6个回答

14
  1. 停止 Docker 服务
  2. 删除 /var/lib/docker
  3. 启动 Docker 服务

4
问题在于我有一些需要持续运行的容器,而这样做将彻底清除我的安装! - Addo Solutions
这真是太疯狂了,我有一个看起来已经损坏的图层,这意味着我不能成功地拉取它,也无法将其删除,因为图像不存在。这个答案似乎是唯一的选择。 - John B

8

警告:
删除/var/lib/docker/overlay2目录中的某些文件夹可能看起来很吸引人,也可以起到作用,但这也是有风险的。事实上,它可能会创建额外的不一致/损坏的层。
如果您要这样做,请先对您想要删除的文件夹进行完全备份。
我曾在生产环境中进行过两次尝试。第一次成功了,第二次引起了真正的混乱(为解决问题而花费了大量时间和精力)。
自那以后,我再也没有这样做过。

以下是解决镜像拉取问题(未找到或损坏的层)的技巧。

1-如果您可以并且愿意清除所有映像和容器,则可以执行以下操作。

停止并删除所有容器(正在运行或未运行):

docker rm $(docker stop $(docker ps -aq)) 

此外,还需使用系统清理命令:

docker system prune --volumes --all 
  • 删除所有停止的容器
  • 删除所有未被至少一个容器使用的网络
  • 删除所有未被至少一个容器使用的卷
  • 删除所有没有至少一个关联容器的镜像
  • 删除所有构建缓存

为跳过确认对话框, 请添加 -f 标志。

它应该解决损坏的层问题,因为您会从头开始重新启动。

2 - 如果不起作用(即层仍然没有找到或损坏), 可能的策略是确保在拉取过程中不再使用这些失败的层。

  • 如果问题是父镜像层: 我更新 Dockerfile 中指定的基础镜像,以找到不再使用具有问题的层的基础镜像版本。 通常我会指定稍微更新的版本,然后构建/运行。 如果可以,很好。 如果仍然失败,则进一步更新基础镜像版本。
  • 如果问题是在我的 Dockerfile 步骤中创建的镜像层本身: 我在 docker build 中指定 --no-cache 标志。

3

只需使用docker images -a选项即可了解所有带有图层的镜像。要了解特定图像的特定图层,可以使用docker history $image_name

此外,还有一个选项可以删除悬空镜像,从而可以删除它。

docker rmi $(docker images -f dangling=true -q)

悬空镜像:

Docker镜像由多个层组成。悬空镜像是指与任何标记镜像没有关系的层。它们不再起作用并占用磁盘空间。您可以通过在docker images命令中添加过滤器标志-f,其值为dangling=true来定位它们。当您确定要删除它们时,可以添加-q标志,然后将其ID传递给docker rmi:

希望这能帮到您。谢谢!


1
docker images -f dangling=true 似乎没有列出层。Franco的答案似乎是唯一可用的答案。 - zaTricky

0

刚刚遇到了完全相同的问题(在我的情况下是node:latest)

在遇到相同问题后,我所做的是:

[root@container1 docker]# docker rmi -f node:latest
Untagged: node:latest
Untagged: node@sha256:908e8182394cb5672465780ed45512d9b78dccd10d674e84158ea65b40bba755
[root@container1 docker]# docker pull node:latest
latest: Pulling from library/node
Digest: sha256:908e8182394cb5672465780ed45512d9b78dccd10d674e84158ea65b40bba755
Status: Downloaded newer image for node:latest

^^ 这就是我们卡住的地方
但事实证明,当 Docker 镜像尝试构建时,存在一个残留镜像:
[root@container1 containers]# docker ps -a
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS                           PORTS               NAMES
a3af68deafbd        4c144cb53d02                           "/bin/sh -c 'sed -i …"   5 minutes ago       Created                                              flamboyant_keller

所以删除那个边缘容器:

[root@container1 containers]# docker rm a3af68deafbd
a3af68deafbd

然后强制删除图像

[root@container1 containers]# docker rmi -f node:latest
Untagged: node:latest
Untagged: node@sha256:908e8182394cb5672465780ed45512d9b78dccd10d674e84158ea65b40bba755
Deleted: sha256:451b716593e5f4b35826c8f869950135b925e74d0ed0a40b7c794b8a54ce9b39
Deleted: sha256:a03d77a43b5351b97ef19f81c840533ff6422114700b1681ee7c151a832fb87c
Deleted: sha256:e6a6066bc15756135253b5fe918000872498a3a3ac32f0bf2bce09536268778c
Deleted: sha256:fbe47ce144caf697d31353941e02e3fb3595c8ecb90cc3d9267a491abd7aa6a7
Deleted: sha256:8d8dabce32d508dfcd126ab43cde7b690764c4bd06800e7cac816d367473ad3e
Deleted: sha256:addff6454b75bcccc23ba0cdbf9ff5d83f6df71523cd3428261d1785c3e3c592
Deleted: sha256:dae4f674403b331cb8c19b2c238ffa7d5a7249a1b4fafc4725054201dce3341a
Deleted: sha256:a9a9c8853295275070975beba78ec0f573172e6e41b30232a00d8af0d49b8ef3
Deleted: sha256:ddf0293e8e23246803d265b158ffbb9453d925fe392b43515984815853e9121b
Deleted: sha256:f94641f1fe1f5c42c325652bf55f0513c881c86b620b912b15460e0bca07cc12


[root@container1 containers]# docker pull node:latest
latest: Pulling from library/node
c5e155d5a1d1: Pull complete
221d80d00ae9: Pull complete
4250b3117dca: Pull complete
3b7ca19181b2: Pull complete
425d7b2a5bcc: Pull complete
69df12c70287: Pull complete
2c4b8b667e51: Pull complete
6a284be89e14: Pull complete
9b005e913bed: Pull complete
Digest: sha256:908e8182394cb5672465780ed45512d9b78dccd10d674e84158ea65b40bba755
Status: Downloaded newer image for node:latest

就是这样了


0

Docker rmi 命令应该可以从您的机器中删除所有镜像层。您可以尝试使用以下命令强制删除:

docker rmi --force [IMAGE]


3
我尝试了docker rmi,成功删除了镜像。现在我想要重新拉取这个镜像,但是有些层已经存在了。 当我尝试运行docker时,它会报错 oci runtime error ..... file not found。 这些镜像在其他机器上可以使用,并且在这台机器上之前几小时也能用。 - Roopak A Nelliat
您的问题现在解决了吗?这个答案解决了您的问题吗? - Simon I

0
在我的情况下,docker image ls -a 没有列出由于电力故障而损坏的镜像。我无法正确地拉取或删除该镜像。因此,我通过将镜像拉到另一台机器上,并使用以下命令将其保存到文件中进行修复:

docker image save -o /tmp/layers111

然后我使用以下命令进行操作:

docker image load -i /tmp/layers111

由于它抱怨该文件已经存在,所以我添加了后缀 _old 并重复该过程,直到所有层都被复制/加载。然后 docker images 显示了被破坏的镜像以及我加载的镜像,其名称和版本已增加!现在一切都运行正常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接