记录一次docker build未打tag导致服务器磁盘占满

Date
Created
Aug 12, 2024 08:30 AM
Descrption
好记性不如烂笔头
Tags
后端
全栈工程师
notion image
 
偶然发现服务器空间不知不觉快满了,想了一下这台机器前段时间才从centos切换到ubantu,装了一个go服务,一个mysql和redis,不可能占用这么大空间。
notion image
突然想不到了是不是go服务每次部署的时候都是装了新的,但是旧的也在,查看了一下果然是:
notion image

原因:

由于我每次部署的时候,docker build没有打tag,所以docker帮我自动生成了tag,那么每次拉取的时候,go镜像都是一个新的镜像,因为他们的tag不一致。
 

解决办法:

解决办法也很简单,修改GitHub的workflow脚本:
💡
如果你不需要保留每个构建的历史镜像,并且只需要最新的镜像,可以使用 latest 作为 tag。这样每次推送的镜像都会覆盖之前的镜像,从而避免累积:
notion image
 
并且在服务器上部署的时候,也拉最新的镜像就可以:
docker pull kangleon28/noname-server:latest

结果:

notion image
 
感谢GPT义父!
 
附上义父回答的完整答案:
 
根据你描述的问题,主要是由于每次构建时镜像的 tag 没有变化,导致服务器上累积了大量的旧镜像,从而占用了大量的磁盘空间。以下是解决此问题的几种方法:
1. 使用唯一的 tag
通过给每个构建的 Docker 镜像打上一个唯一的 tag,例如使用 Git 的 SHA 或构建时间戳。这样可以区分不同的构建,同时也有助于清理旧的镜像。
在 workflow 文件中,可以像这样更新你的 Build Docker image 和 Push Docker image to Docker Hub 步骤:
- name: Build Docker image run: docker build -t kangleon28/noname-server:${{ github.sha }} . - name: Push Docker image to Docker Hub run: docker push kangleon28/noname-server:${{ github.sha }}
在部署的时候,你需要使用这个 tag 来拉取并运行镜像:
docker pull kangleon28/noname-server:$IMAGE_TAG
2. 清理旧的 Docker 镜像
定期清理旧的 Docker 镜像,避免磁盘空间被占满。可以在服务器上设置一个 cron job,定期运行以下命令来清理未使用的镜像:
docker system prune -f
如果你想自动清理一定时间前创建的镜像,可以使用以下命令:
docker image prune -a --filter "until=24h"
这将删除 24 小时之前创建的未使用的 Docker 镜像。
3. 使用稳定的 latest tag
如果你不需要保留每个构建的历史镜像,并且只需要最新的镜像,可以使用 latest 作为 tag。这样每次推送的镜像都会覆盖之前的镜像,从而避免累积:
- name: Build Docker image run: docker build -t kangleon28/noname-server:latest . - name: Push Docker image to Docker Hub run: docker push kangleon28/noname-server:latest
在部署时,只需拉取 latest tag 的镜像即可:
docker pull kangleon28/noname-server:latest
总结
使用唯一 tag 可以帮助你管理不同版本的镜像,但可能需要定期清理旧镜像以节省磁盘空间。
清理旧镜像 是管理磁盘空间的关键操作,可以手动执行或通过自动化脚本来实现。
使用 latest tag 是最简单的方式,它会覆盖旧的镜像,适合只需要最新版本的场景。
根据你的需求,选择合适的策略来优化 Docker 镜像管理,并保持服务器的磁盘空间清洁。
 

最近更新:

在服务器上docker pul之前,进行一下旧镜像的删除,非常有效:
docker images -f "dangling=true" -q | xargs -r docker rmi docker rmi kangleon28/noname-server:latest || true