RustFS 图像插件模板
给 AI coding agent 的任务提示词
你正在基于 RustFS OCI 插件模板开发一个独立的对象处理插件。先阅读本 README、
src/main.rs和Cargo.toml,再按我的业务要求修改。保持 Runner 的rustfs.job/v2alpha1输入与本地制品输出合同:从/input/input.json读取完整 attempt identity、精确对象版本和有界参数;从/credentials/credential.json读取短期凭据;只读获取指定版本;只把产物和result.json写到/output。使用 Rust 和 libvips 实现图像操作,为每个新分支补测试。拒绝缺失或nullversionId、未知字段、越界尺寸和不支持的格式。禁止把凭据放进日志、命令行、环境变量或结果文件。完成后运行 README 中的测试和 Docker 构建,报告实际命令、结果、支持范围和未实现能力。
请把这段提示词连同具体业务需求交给 agent。它会把本目录作为可运行模板,不需要先猜 Runner 的容器文件协议。
当前样例
样例接收已版本化的 RustFS 图片对象,使用 Runner 提供的短期只读 S3 凭据获取指定 versionId,再用 libvips 做缩略处理和格式转换。它支持:
- 等比缩小并限制在目标宽高内(
fit: "inside"); - 等比缩小并居中裁剪(
fit: "cover");源图不足时不放大,结果会小于目标边长; - 根据图片方向元数据自动旋正;
- 输出 PNG、JPEG 或 WebP;JPEG/WebP 使用 libvips 默认编码质量。
这个测试插件只实现上述基础操作。腾讯云数据万象还覆盖水印、模糊、锐化、EXIF/主色调、动图和智能处理等能力;这些都不是本样例已支持的功能。后续可以按需把单项能力做成明确参数和测试,不要在 manifest 或 README 中宣称未实现的功能。
Runner 文件合同
Runner 会把以下只读文件和可写目录挂进容器:
/input/input.json:rustfs.job/v2alpha1,包含attempt、object和parameters;object.version必须是具体非空版本,不能是 S3 的null哨兵。/credentials/credential.json:access_key、secret_key和可选session_token。这是 attempt 级短期凭据,只用于读源对象。/output/:唯一可写目录。插件写入image.png、image.jpg或image.webp,并写result.json声明文件名和原始完整 attempt identity。Runner 负责把本地产物上传到受控结果桶并绑定精确版本。
最小输入示例:
{
"schema": "rustfs.job/v2alpha1",
"attempt": {
"platform": "example",
"run": "00000000-0000-4000-8000-000000000001",
"attempt": "00000000-0000-4000-8000-000000000002",
"epoch": "1",
"session": "00000000-0000-4000-8000-000000000003",
"control_generation": "generation-1"
},
"object": {
"bucket": "images",
"key": "uploads/photo.jpg",
"version": "3Lg...exact-version"
},
"parameters": {
"width": 320,
"height": 240,
"fit": "cover",
"format": "webp"
}
}
parameters 可省略:默认 320×240、inside、WebP。源对象上限为 32 MiB,解码像素上限为 50 MP,目标边长上限为 10,000 像素,输出上限为 Runner 的 16 MiB 本地制品预算。容器应通过 CLI --endpoint 和 --region 接收存储地址,不接受密钥参数;HTTPS 是默认要求,仅 loopback HTTP 允许本地 smoke test。
结果文件形状:
{
"schema": "rustfs.job/v2alpha1",
"attempt": { "与输入完全相同的 identity" },
"outcome": "ACCEPTED",
"artifacts": [{ "name": "image", "file": "image.webp" }]
}
构建与测试
需要 Docker Compose v2 或 Docker CLI,并使用与 Runner 节点相同的 CPU 架构构建。直接运行 Cargo 测试还需要安装 libvips 开发包和 pkg-config;Docker 构建会准备这些依赖并运行单测,运行镜像只带二进制、CA 证书和 libvips 运行库:
cargo test --locked --manifest-path examples/plugin-template-image/Cargo.toml
docker build -t rustfs-image-transform:dev examples/plugin-template-image
把镜像构建并签名后,按 Runner 的受信镜像流程配置 digest 和发布者,不要让 Runner 通过 tag 或无约束 pull 取得镜像。任务命令示例:
["/usr/local/bin/rustfs-image-transform", "--endpoint", "https://s3.example.internal:9000", "--region", "us-east-1"]
扩展边界
每次扩展先决定输入参数、尺寸/像素/帧/内存上限、输出格式与失败语义,然后为变换和边界条件加测试。增加水印或检测能力时,明确字体、图片资源从哪里来,以及是否需要额外权限;不要假设容器可写宿主文件或能访问任意网络。生产镜像应继续使用 Runner 实施的非 root、只读根文件系统、网络出口限制、CPU/内存/PID 和输出容量限制。
功能参考:腾讯云数据万象图片处理;处理引擎:libvips 操作列表;Rust bindings:libvips crate。