从AWS拉取Docker镜像时出现“设备上没有剩余空间”的错误

7

我正在从AWS拉取多种Docker镜像,但它在最后一个镜像上出现以下错误而卡住了

ERROR: for <container-name>  failed to register layer: Error processing tar file(exit status 1): symlink libasprintf.so.0.0.0 /usr/lib64/libasprintf.so: no space left on device
ERROR: failed to register layer: Error processing tar file(exit status 1): symlink libasprintf.so.0.0.0 /usr/lib64/libasprintf.so: no space left on device

有人知道如何解决这个问题吗?

我已经尝试停止docker,删除var/lib/docker并重新启动它,但它仍然卡在同一个地方。

df -h的结果:

Filesystem      Size  Used Avail Use% Mounted on

/dev/nvme0n1p1  8.0G  6.5G  1.6G  81% /

devtmpfs        3.7G     0  3.7G   0% /dev

tmpfs           3.7G     0  3.7G   0% /dev/shm

tmpfs           3.7G   17M  3.7G   1% /run

tmpfs           3.7G     0  3.7G   0% /sys/fs/cgroup

tmpfs           753M     0  753M   0% /run/user/0

tmpfs           753M     0  753M   0% /run/user/1000

命令“df -h”的输出是什么? - Thanh Nguyen Van
我已经把它放在问题中了。 - J.Main
尝试拉取:docker pull hello-world,是否出现错误? - Thanh Nguyen Van
3个回答

10

问题出在EC2实例没有分配足够的EBS存储空间。按照以下步骤进行解决:

  • 导航至EC2
  • 查看实例详情,找到根设备和块设备
  • 点击路径并选择EBS ID
  • 在卷面板中单击操作
  • 选择修改卷
  • 输入所需卷大小(默认为8GB,通常不需要更大)
  • SSH进入实例
  • 运行lsblk以查看可用卷并记录大小
  • 在要调整大小的卷上运行sudo growpart /dev/volumename 1
  • 运行sudo xfs_growfs /dev/volumename(lsblk挂载点列中带/的那一个)

对于具有分区的卷,例如在上一步中显示的卷,请使用growpart命令扩展分区。请注意设备名称和分区号之间有一个空格。[ec2-user ~]$ sudo growpart /dev/xvda 1 [ec2-user ~]$ sudo growpart /dev/xvdf 1 - almgwary

2

可能是旧的Docker镜像、卷等仍然占用着您的EBS存储空间。根据Docker文档

Docker在清理未使用的对象(通常称为“垃圾回收”),如镜像、容器、卷和网络方面采取保守的方法:除非您明确要求Docker这样做,否则通常不会删除这些对象。这可能导致Docker使用额外的磁盘空间。

通过SSH进入您的EC2实例并验证实际占用的空间:

ssh ec2-user@<public-ip>
df -h

然后,您可以清理旧的镜像:

docker system prune

从这个命令中读取警告信息!

您还可以修剪卷。如果您没有在本地存储文件(您不应该这样做,它们应该在类似于AWS S3的东西中),请执行此操作。

Use with Caution:

docker system prune --volumes

2

在我遇到同样的问题后,我写了一篇关于这个问题的文章。如果你之前已经成功部署过了,你可能只需要在你的部署过程中添加一些维护操作。在我的情况下,我只需添加一个cronjob来运行以下命令:

docker ps -q --filter "status=exited" | xargs --no-run-if-empty docker rm;
docker volume ls -qf dangling=true | xargs -r docker volume rm;

https://medium.com/@_ifnull/aws-ecs-no-space-left-on-device-ce00461bb3cb


这是我在Mac上使用CDK的解决方案。请注意,--no-run-if-empty 在Mac/BSD上只是 -r(并且被忽略,因为它是默认值);请参见 https://dev59.com/Omsy5IYBdhLWcg3w0RXT#8296746。 - Daniel

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