容器镜像同步 HTTP 服务,支持在不同 Registry 之间异步同步镜像。
- Go 1.25
- Gin v1.12 — HTTP 框架
- go-containerregistry v0.21.7 — crane 镜像操作
- Asynq v0.26 — Redis-backed 异步任务队列
- Go 1.25+
- Redis
go build -o image-sync .
./image-sync --config ./config.yaml服务启动后同时运行 HTTP Server(默认 :8080)和 Asynq Worker。
config.yaml 示例:
server:
port: 8080
redis:
addr: localhost:6379
password: ""
asynq:
concurrency: 10
registries:
harbor:
url: harbor.example.com
username: admin
password: secret
acr:
url: registry.cn-hangzhou.aliyuncs.com
username: ""
password: ""registries是一个 map,key 为 alias(如harbor),API 请求中通过 alias 引用asynq.concurrency控制 Asynq Worker 并发数redis配置供 Asynq 内部使用,服务本身不直接操作 Redis
POST /api/v1/sync
请求体:
{
"src": "harbor",
"dst": "acr",
"image": "library/nginx",
"tag": "1.25",
"priority": "high"
}| 字段 | 必填 | 说明 |
|---|---|---|
src |
是 | 源 Registry alias |
dst |
是 | 目标 Registry alias |
image |
是 | 镜像名(如 library/nginx) |
tag |
是 | 镜像 tag |
priority |
否 | high / default / low,默认 default |
响应 202 Accepted:
{
"task_id": "abc123"
}GET /api/v1/tasks/:id
响应 200 OK:
{
"task_id": "abc123",
"status": "completed",
"completed_at": "2026-07-05T12:00:00Z"
}status 取值:pending / processing / completed / failed。任务不存在时返回 404。
POST /api/v1/sync → Gin 校验 → Asynq 入队(优先级队列)
↓
GET /api/v1/tasks/:id ← Asynq Worker
↓
crane.Pull(src)
↓
crane.Push(dst)
- 异步处理:接口立即返回 task_id,后台执行镜像拷贝
- Asynq 优先级队列:
high→ critical(6) /default→ default(3) /low→ low(1),权重比决定 Worker 消费速率 - 任务最大重试 3 次(Asynq MaxRetry)
- src/dst 使用独立认证(Pull + Push 而非 crane.Copy)