#!/bin/bash set -e IMAGE_NAME="chunlinwang/myubuntu" TAG="latest" CONTAINER_NAME="myubuntu" TMP_FILE="myubuntu_flat.tar" DATE=$(date +%Y%m%d_%H%M) echo "========== 开始重打包 myubuntu (单层干净版) ==========" # 1. 确保容器存在并启动 if ! docker ps -a | grep -q "$CONTAINER_NAME"; then echo "❌ 容器 $CONTAINER_NAME 不存在!" exit 1 fi echo "[+] 启动容器..." docker start "$CONTAINER_NAME" echo "[+] 等待容器就绪..." sleep 3 # 2. 在容器内执行深度清理 echo "[+] 开始在容器内执行清理..." docker exec "$CONTAINER_NAME" bash -c ' echo "→ 清理宝塔日志和备份..." rm -rf /www/wwwlogs/* echo "日志已清理" > /www/wwwlogs/cleaned.log rm -rf /www/backup/* echo "→ 清理面板缓存..." rm -rf /www/server/panel/logs/* rm -rf /www/server/panel/data/tmp/* echo "→ 清理 MySQL binlog..." rm -f /www/server/data/mysql-bin.* /www/server/data/relay-log.* 2>/dev/null echo "→ 清理 PHP sessions 和临时文件..." rm -rf /www/server/php/*/var/sessions/* 2>/dev/null rm -rf /tmp/* /var/log/* /var/tmp/* /root/.cache/* 2>/dev/null echo "→ 清理 apt 缓存..." apt-get clean >/dev/null 2>&1 rm -rf /var/lib/apt/lists/* echo "→ 清理其他大日志..." find /www -name "*.log" -type f -size +5M -delete 2>/dev/null echo "清理完成,当前占用情况:" df -h du -sh /www/* 2>/dev/null | sort -hr ' # 3. 停止容器准备导出 echo "[+] 停止容器..." docker stop "$CONTAINER_NAME" # 4. 备份旧镜像 echo "[+] 备份旧 latest 为 ${DATE}-old..." if docker image inspect "${IMAGE_NAME}:${TAG}" >/dev/null 2>&1; then docker tag "${IMAGE_NAME}:${TAG}" "${IMAGE_NAME}:${DATE}-old" echo "旧镜像已备份为 ${IMAGE_NAME}:${DATE}-old" fi # 5. 导出 + 导入为单层新镜像 echo "[+] 导出容器为单层 tar..." docker export "$CONTAINER_NAME" -o "$TMP_FILE" echo "[+] 导入为新单层 latest 镜像..." docker import \ -c 'ENTRYPOINT ["/entrypoint.sh"]' \ -c 'CMD []' \ "$TMP_FILE" "${IMAGE_NAME}:${TAG}" # 6. 清理临时文件 rm -f "$TMP_FILE" # 7. 完成信息 echo "========== 重打包完成!==========" echo "新镜像:" docker images "${IMAGE_NAME}" --format "table {{.Repository}}:{{.Tag}}\t{{.Size}}\t{{.ID}}" echo "当前磁盘占用:" df -h echo "提示:旧镜像已备份为 ${IMAGE_NAME}:${DATE}-old,可随时回滚。"