You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.4 KiB
Bash

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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可随时回滚。"