#!/bin/bash set -e # ===================== # 参数检查 if [[ $# -lt 2 ]]; then echo "用法: $0 <容器名> <镜像名> [保留备份个数]" echo "示例: $0 dev-env dev-env 3" exit 1 fi CONTAINER_NAME="$1" IMAGE_NAME="$2" KEEP_BACKUPS="${3:-3}" # 默认保留 3 个 # ===================== TAG_LATEST="${IMAGE_NAME}:latest" BACKUP_TAG="${IMAGE_NAME}:backup-$(date +%Y%m%d-%H%M%S)" echo "📦 正在为镜像 '${TAG_LATEST}' 生成备份..." docker tag "${TAG_LATEST}" "${BACKUP_TAG}" echo "✅ 备份完成: ${BACKUP_TAG}" echo "📝 提交容器 '${CONTAINER_NAME}' 到镜像 '${TAG_LATEST}'..." docker commit "${CONTAINER_NAME}" "${TAG_LATEST}" echo "✅ 提交完成: ${TAG_LATEST}" echo "🧹 清理多余的备份,只保留最近 ${KEEP_BACKUPS} 个..." # 找出多余的备份镜像 BACKUPS=$(docker images --format "{{.Repository}}:{{.Tag}} {{.CreatedAt}}" | grep "${IMAGE_NAME}:backup-" | sort -r -k2 | awk '{print $1}') COUNT=0 for b in ${BACKUPS}; do COUNT=$((COUNT+1)) if [ $COUNT -gt ${KEEP_BACKUPS} ]; then echo "🗑️ 删除旧备份: ${b}" docker rmi "${b}" fi done echo "🎉 完成!" docker images | grep "${IMAGE_NAME}"