场景:
想要在服务器上load一个镜像,用于使用Dockerfile 进行其他服务镜像的打包。
问题描述
在docker load 了一个镜像,结果过了一会,镜像自己消失了。就是镜像自动消失了。
我这里load的是一个openjdk 的镜像,
使用以下命令进行的load
# gunzip -c openjre.tar.gz | docker load
完成后,通过查询,可以看到该镜像是存在的
# docker images |grep openjdk
这时候立马通过Dockerfile docker build -t 对我想要打镜像的服务进行打镜像包。也是可以打出对应的镜像的。
后续过了一会就好发现load进来的openjdk 镜像没了。新打的镜像也消失了。
原因分析:
我这里是通过度娘查到的原因,给出的大概几个原因:
1. 磁盘空间管理:当主机磁盘空间不足时,Docker守护进程可能会根据其内部的垃圾回收策略自动删除不再使用的镜像以释放空间。这通常会影响到那些没有被任何容器引用的镜像。
2. 手动或自动清理:用户或系统管理员可能执行了docker system prune、docker image
prune等命令来清理未使用的镜像,这些命令会删除所有 dangling(孤立)镜像或者按照指定条件筛选出不再需要的镜像并进行删除。
3.仓库问题:如果镜像是从远程仓库(如 Docker Hub
或私有仓库)拉取的,并且后来该仓库中的镜像被删除或者因为网络原因导致无法访问,则在本地通过标签引用的镜像可能无法正常pull和使用,看起来像是消失了。
4. 配置错误或软件故障:某些情况下,由于Docker本身的配置错误、软件bug或与其他系统服务冲突,可能会导致镜像列表无法正确显示或镜像文件丢失。
5.系统故障或重启:虽然不常见,但如果在操作系统层面发生故障,比如非正常关机或硬件故障,可能导致存储在本地磁盘上的Docker镜像数据损坏或丢失。
6. 意外操作:误操作如直接删除了镜像所依赖的存储文件,也会导致镜像看似“消失”。
根据我这里的实际情况判断,大概率是docker数据卷分配空间不足。
解决方案:
因为docker 的垃圾回收策略只是回收未使用的镜像,我这里就简单的处理了一下,镜像生成后,直接docker run 一下,这样就不会被清理掉了。
当然这里只是应急处理。
正确方法应该是增加磁盘空间。
或者禁用docker image prune自动化任务: 如果你之前设置了定时任务或cron job来运行docker system prune或其他清理命令,可以取消这些任务。
或者增大Docker数据卷的大小: 如果使用的是虚拟机环境,可以考虑增加分配给Docker的数据卷大小