logo
1
0
Login

Rsync 插件 Docker 镜像

这是一个轻量级的、基于 Alpine 的 Docker 镜像,它使用 rsync 通过 SSH 安全地同步文件。该镜像基于 drone-rsync 重新实现,专为 CI/CD 流水线(兼容 Drone CI, CNB 等平台的插件 API)设计,通过环境变量进行配置,实现自动化部署或文件分发。

✨ 功能特性

  • 多主机支持: 一次性将文件同步到多个远程主机。
  • 安全可靠: 使用 SSH 私钥进行身份验证,通过 rsync 进行高效的文件传输。
  • 高度可配: 支持 includeexclude 规则,可自定义 rsyncssh 参数。
  • 生命周期挂钩: 支持在 rsync 执行前后在远程主机上运行自定义脚本 (prescript, script)。
  • 原子化操作: 支持 --delete 选项,确保目标目录与源目录完全一致。
  • 轻量级: 基于 Alpine Linux 构建,镜像体积小,启动迅速。

🚀 快速开始

1. 准备工作

  • SSH 密钥: 生成一个 SSH 密钥对,并将公钥 (如 id_rsa.pub) 添加到目标远程主机的 ~/.ssh/authorized_keys 文件中。
  • 项目文件: 准备好需要同步的源文件夹。

2. 在云原生构建中使用

可参考 CNB 插件市场中的 rsync 插件说明 编写流水线配置文件,然后 image 设置为当前仓库提供的镜像 docker.cnb.cool/rainy-nook/rsync-plugin,例如:

# .cnb.yml main: push: - stages: - name: rsync image: docker.cnb.cool/rainy-nook/rsync-plugin # 引用密钥仓库配置文件 imports: https://your-git.com/group/secret-repo/-/blob/main/env.yml settings: user: $LOGIN_USER key: $PRIVATE_KEY hosts: - ip1 - ip2 source: ./dist/ target: ~/target/ # 以上为必填参数,以下为可选参数 port: 22 include: - "app.tar.gz" - "app.tar.gz.md5" exclude: - "*" prescript: - cd ~/packages - md5sum -c app.tar.gz.md5 - tar -xf app.tar.gz -C ~/app script: - cd ~/packages - md5sum -c app.tar.gz.md5 - tar -xf app.tar.gz -C ~/app

⚙️ 参数配置

以下是所有可用的参数:

参数是否必须默认值描述
hosts(无)远程主机列表,多个主机用逗号 , 分隔。例如: host1.com,192.168.1.10
key(无)用于 SSH 认证的私钥内容
target(无)远程主机上的目标文件夹路径。例如: /var/www/my-app
userroot用于登录远程主机的用户名。
port22远程主机的 SSH 连接端口。
source./要同步的源文件夹路径,相对于工作目录。
recursivefalse是否递归同步子目录。设置为 true 时,会添加 -r 标志。
deletefalse是否删除目标文件夹中存在但源文件夹中不存在的文件。
include(空)Rsync 的 include 规则列表,用逗号 , 分隔。
exclude(空)Rsync 的 exclude 规则列表,用逗号 , 分隔。例如: ".git/,*.log"
args(空)额外的 rsync 命令行参数。例如: "--checksum --no-times"
prescript(空)rsync 之前在远程主机上执行的命令。
script(空)rsync 之后在远程主机上执行的命令。
log_levelquietSSH 的日志级别。可选值: quiet, verbose, debug, trace

💡 本地测试示例

示例 1: 基本同步

将当前目录的所有内容同步到一台服务器的 /opt/my-project 目录。

# 1. 准备私钥内容 KEY_CONTENT=$(cat ~/.ssh/id_rsa) # 2. 运行 Docker 容器 docker run --rm -it \ -v "$(pwd):/workspace" \ -w /workspace \ -e PLUGIN_HOSTS="your_server_ip" \ -e PLUGIN_USER="deploy" \ -e PLUGIN_KEY="${KEY_CONTENT}" \ -e PLUGIN_TARGET="/opt/my-project" \ -e PLUGIN_RECURSIVE="true" \ docker.cnb.cool/rainy-nook/rsync-plugin

示例 2: 高级部署

部署一个 Web 应用到两台服务器,同时排除不必要的文件,并在部署后重启服务。

  • 目标:
    1. 同步到 server1.comserver2.com
    2. 递归同步。
    3. 删除目标目录多余的文件 (--delete)。
    4. 排除 .git 目录和所有 .log 文件。
    5. 在同步前,确保目标目录存在。
    6. 在同步后,执行 systemctl restart my-app.service 命令。
# 1. 准备私钥内容 KEY_CONTENT=$(cat ~/.ssh/id_rsa) # 2. 运行 Docker 容器 docker run --rm -it \ -v "$(pwd)/build:/app/build" \ -w /app/build \ -e PLUGIN_HOSTS="server1.com,server2.com" \ -e PLUGIN_USER="deploy" \ -e PLUGIN_KEY="${KEY_CONTENT}" \ -e PLUGIN_TARGET="/var/www/my-app" \ -e PLUGIN_SOURCE="./" \ -e PLUGIN_RECURSIVE="true" \ -e PLUGIN_DELETE="true" \ -e PLUGIN_EXCLUDE=".git/,*.log" \ -e PLUGIN_ARGS="--checksum" \ -e PLUGIN_PRESCRIPT="mkdir -p /var/www/my-app" \ -e PLUGIN_SCRIPT='echo "Deployment complete! Restarting service..." && systemctl restart my-app.service' \ docker.cnb.cool/rainy-nook/rsync-plugin

注意: 在 PLUGIN_SCRIPT 中,我们使用了单引号 ' ' 来包裹整个命令字符串,以防止 ! 等特殊字符被本地 Shell 解释。

SSH 密钥处理

本插件要求将 SSH 私钥的内容直接作为环境变量 PLUGIN_KEY 的值传入。脚本会自动将这个字符串内容写入容器内的一个临时文件中 (~/.ssh/id_rsa),并设置正确的权限,供 sshrsync 命令使用。该临时文件会在容器退出时被自动清理。

在本地测试时,可以使用 $(cat path/to/your/key) 的方式来读取文件内容。在真实的 CI/CD 环境中,请务必使用平台自带的密钥管理功能。

About

重新实现的 rsync 插件使用的镜像,兼容 CNB 与 Drone 流水线

Language
Shell50.5%
Markdown46.3%
Dockerfile3.2%