实用脚本能批量镜像吗?

wen 实用脚本 10

本文目录导读:

实用脚本能批量镜像吗?

  1. 批量文件/目录镜像 (rsync)
  2. 批量Docker镜像镜像(同步到私有仓库)
  3. 批量Git仓库镜像(同步所有仓库)
  4. 批量MySQL/MariaDB数据库镜像(备份+还原)
  5. 批量S3/对象存储镜像 (aws CLI + 循环)
  6. 💡 实用技巧

批量文件/目录镜像 (rsync)

最常用的是 rsync,结合 findfor 循环。

脚本示例 (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): 使用 mysqldumpmysql 配合循环。

#!/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

💡 实用技巧

  1. 使用配置文件:将源和目标对写入 .csv.json 文件中,脚本读取数组,方便管理大批量任务。
  2. 日志记录:添加时间戳重定向到日志文件:
    echo "$(date) - 开始同步 $dir" >> sync.log
  3. 错误重试:对于网络不稳定的情况,添加重试逻辑:
    for i in {1..3}; do
        rsync ... && break || sleep 5
    done
  4. 并行执行:使用 &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构件等),可以告诉我,我可以提供更针对性的脚本示例。

抱歉,评论功能暂时关闭!