本文目录导读:

- 批量文件/目录镜像 (rsync)
- 批量Docker镜像镜像(同步到私有仓库)
- 批量Git仓库镜像(同步所有仓库)
- 批量MySQL/MariaDB数据库镜像(备份+还原)
- 批量S3/对象存储镜像 (aws CLI + 循环)
- 💡 实用技巧
批量文件/目录镜像 (rsync)
最常用的是 rsync,结合 find 或 for 循环。
脚本示例 (bash): 同步多个本地目录到远程服务器
#!/bin/bash
# 定义源目录列表和目标基础路径
SOURCE_DIRS=(
"/data/project1"
"/data/project2"
"/data/project3"
)
REMOTE_USER="user"
REMOTE_HOST="192.168.1.100"
REMOTE_BASE_PATH="/backup"
for dir in "${SOURCE_DIRS[@]}"; do
# 获取目录名(如 project1)
dir_name=$(basename "$dir")
echo "正在同步: $dir -> $REMOTE_HOST:$REMOTE_BASE_PATH/$dir_name"
rsync -avz --delete "$dir/" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_BASE_PATH}/${dir_name}/"
if [ $? -eq 0 ]; then
echo "✅ 同步成功: $dir_name"
else
echo "❌ 同步失败: $dir_name"
fi
done
批量Docker镜像镜像(同步到私有仓库)
从 Docker Hub 拉取并重新打标签推送到私有仓库。
脚本示例 (bash):
#!/bin/bash
PRIVATE_REGISTRY="registry.yourcompany.com"
IMAGES_LIST=(
"nginx:1.25"
"redis:7-alpine"
"mysql:8.0"
"node:18-alpine"
)
for image in "${IMAGES_LIST[@]}"; do
echo "处理镜像: $image"
# 拉取原始镜像
docker pull "$image" || { echo "❌ 拉取失败"; continue; }
# 打标签到私有仓库
new_tag="${PRIVATE_REGISTRY}/library/${image}"
docker tag "$image" "$new_tag"
# 推送到私有仓库
docker push "$new_tag" && echo "✅ 推送成功: $new_tag" || echo "❌ 推送失败: $new_tag"
# 可选:清理本地标签
docker rmi "$new_tag"
done
更高级版: 使用 skopeo 直接跨仓库复制,无需本地存储镜像。
#!/bin/bash
# 需要安装 skopeo: apt install skopeo 或 brew install skopeo
SOURCE_REGISTRY="docker.io"
DEST_REGISTRY="registry.yourcompany.com"
IMAGES=("library/nginx:latest" "library/redis:7" "library/mysql:8.0")
for image in "${IMAGES[@]}"; do
skopeo copy --all \
"docker://${SOURCE_REGISTRY}/${image}" \
"docker://${DEST_REGISTRY}/${image}"
done
批量Git仓库镜像(同步所有仓库)
将一组Git仓库从GitHub等源同步到内部GitLab。
脚本示例 (bash):
#!/bin/bash
GITLAB_GROUP="mygroup"
REPOS=(
"https://github.com/user/repo1.git"
"https://github.com/user/repo2.git"
"https://github.com/user/repo3.git"
)
GITLAB_BASE="git@gitlab.internal.com:${GITLAB_GROUP}"
for repo_url in "${REPOS[@]}"; do
# 提取仓库名(如 repo1)
repo_name=$(basename "$repo_url" .git)
echo "镜像仓库: $repo_name"
# 裸克隆源仓库
git clone --mirror "$repo_url" "/tmp/${repo_name}.git"
# 进入裸仓库目录
cd "/tmp/${repo_name}.git"
# 添加目标远程并推送
git remote add gitlab "${GITLAB_BASE}/${repo_name}.git"
git push --mirror gitlab
cd /tmp
rm -rf "/tmp/${repo_name}.git"
echo "✅ 完成: $repo_name"
done
批量MySQL/MariaDB数据库镜像(备份+还原)
定时将多个数据库远程同步。
脚本示例 (bash): 使用 mysqldump 和 mysql 配合循环。
#!/bin/bash
SOURCE_DB_HOST="db1.example.com"
SOURCE_USER="backup_user"
SOURCE_PASS="password"
DEST_DB_HOST="db2.example.com"
DEST_USER="restore_user"
DEST_PASS="password"
# 要同步的数据库列表
DATABASES=("db_app1" "db_app2" "db_app3")
for db in "${DATABASES[@]}"; do
echo "开始备份: $db"
mysqldump -h "$SOURCE_DB_HOST" -u "$SOURCE_USER" -p"$SOURCE_PASS" \
--single-transaction --routines --triggers "$db" > "/tmp/${db}.sql"
echo "开始还原: $db -> $DEST_DB_HOST"
mysql -h "$DEST_DB_HOST" -u "$DEST_USER" -p"$DEST_PASS" "$db" < "/tmp/${db}.sql"
if [ $? -eq 0 ]; then
echo "✅ 同步完成: $db"
else
echo "❌ 同步失败: $db"
fi
rm -f "/tmp/${db}.sql"
done
批量S3/对象存储镜像 (aws CLI + 循环)
将多个S3桶镜像到另一个区域或另一个云存储(如阿里云OSS)。
#!/bin/bash
SOURCES=(
"s3://my-bucket1/data"
"s3://my-bucket2/logs"
"s3://my-bucket3/assets"
)
DEST_BASE="s3://backup-bucket"
for source in "${SOURCES[@]}"; do
bucket_name=$(echo "$source" | cut -d'/' -f3)
dest_path="${DEST_BASE}/${bucket_name}"
echo "同步: $source -> $dest_path"
aws s3 sync "$source" "$dest_path" --delete
done
💡 实用技巧
- 使用配置文件:将源和目标对写入
.csv或.json文件中,脚本读取数组,方便管理大批量任务。 - 日志记录:添加时间戳重定向到日志文件:
echo "$(date) - 开始同步 $dir" >> sync.log
- 错误重试:对于网络不稳定的情况,添加重试逻辑:
for i in {1..3}; do rsync ... && break || sleep 5 done - 并行执行:使用
&或xargs -P提高效率(注意IO和网络压力):for item in "${ARRAY[@]}"; do (do_sync "$item") & done wait
| 场景 | 推荐工具 | 批量方式 |
|---|---|---|
| 文件/目录 | rsync | for循环+rsync |
| Docker镜像 | skopeo / docker | for循环+skopeo |
| Git仓库 | git clone --mirror | for循环+push |
| 数据库 | mysqldump + mysql | for循环+重定向 |
| 对象存储 | aws s3 / rclone | for循环+sync |
如果你有具体要镜像的资源类型(如Debian软件包、npm包、Maven构件等),可以告诉我,我可以提供更针对性的脚本示例。