1. 项目概述
在容器化部署的现代开发流程中,镜像仓库的同步管理是个常见痛点。我最近用GitHub Actions配合image-syncer工具,搭建了一套从Docker Hub到Azure容器注册表(ACR)的自动化同步方案,完美解决了跨国镜像拉取慢和合规审计的需求。这个方案特别适合需要同时使用公有和私有镜像仓库的团队,下面就把完整实现过程分享给大家。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心组件解析
2.1 GitHub Actions工作流
GitHub Actions是GitHub提供的CI/CD服务,通过YAML文件定义工作流。在我们的场景中,它主要承担定时触发和任务调度的角色。相比自建Jenkins等方案,它的优势在于:
- 与GitHub仓库原生集成
- 每月2000分钟的免费额度
- 预装了各类常用工具链
2.2 image-syncer工具
image-syncer是阿里云开源的镜像同步工具,相比docker pull/push的传统方式,它有三大优势:
- 支持多仓库并发同步
- 自动跳过已存在的镜像层
- 提供详细的同步日志
2.3 容器注册表服务
- Docker Hub:全球最大的公共镜像仓库
- Azure ACR:微软云提供的私有镜像仓库服务,支持异地复制和内容信任
3. 完整实现步骤
3.1 环境准备
首先需要在Azure Portal创建ACR实例:
- 登录Azure门户
- 搜索"容器注册表"服务
- 选择"基本"SKU即可满足大多数场景
- 记下登录服务器地址(如myregistry.azurecr.io)
3.2 配置ACR访问凭证
在GitHub仓库中添加以下Secrets:
- ACR_USERNAME:ACR管理员用户名
- ACR_PASSWORD:ACR访问令牌
- DOCKERHUB_USERNAME:Docker Hub账号(如需同步私有镜像)
bash复制# 测试ACR登录
echo $ACR_PASSWORD | docker login myregistry.azurecr.io -u $ACR_USERNAME --password-stdin
3.3 编写同步配置文件
创建sync.yaml文件定义同步规则:
yaml复制version: 1.0
sync:
- source: docker.io/library/nginx
target: myregistry.azurecr.io/library/nginx
type: repository
- source: docker.io/ubuntu
target: myregistry.azurecr.io/base-images/ubuntu
type: repository
注意:target路径可以自定义,建议按业务分类组织
3.4 创建GitHub Actions工作流
在.github/workflows目录下新建image-sync.yml:
yaml复制name: Docker Hub to ACR Sync
on:
schedule:
- cron: '0 3 * * *' # 每天UTC时间3点运行
workflow_dispatch: # 支持手动触发
jobs:
sync-images:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up image-syncer
run: |
wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.3.0/image-syncer-v1.3.0-linux-amd64.tar.gz
tar -xzf image-syncer*.tar.gz
chmod +x image-syncer
- name: Run sync
env:
ACR_USERNAME: ${{ secrets.ACR_USERNAME }}
ACR_PASSWORD: ${{ secrets.ACR_PASSWORD }}
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
run: |
./image-syncer --proc=4 --auth=./auth.json --config=./sync.yaml --log=./sync.log
4. 高级配置技巧
4.1 增量同步优化
通过--retries=3参数增加重试次数,并添加--ignore-errors避免单镜像失败中断整个流程:
yaml复制steps:
- run: |
./image-syncer \
--proc=4 \
--retries=3 \
--ignore-errors \
--auth=./auth.json \
--config=./sync.yaml
4.2 多架构镜像支持
在sync.yaml中启用多架构同步:
yaml复制version: 1.0
sync:
- source: docker.io/library/redis
target: myregistry.azurecr.io/db/redis
type: repository
os: linux
architectures: ["amd64", "arm64"]
4.3 敏感镜像过滤
使用exclude规则避免同步测试镜像:
yaml复制rules:
exclude:
- "*-rc*"
- "*-test*"
- "*-dev*"
5. 常见问题排查
5.1 认证失败问题
错误现象:
code复制ERROR: failed to authorize: failed to fetch oauth token: unexpected status: 401 Unauthorized
解决方案:
- 检查ACR密码是否过期(默认180天有效期)
- 确认GitHub Secrets中的用户名密码是否正确
- 尝试使用
az acr login命令测试本地登录
5.2 网络超时问题
错误现象:
code复制Get "https://registry-1.docker.io/v2/": net/http: request canceled
优化方案:
- 增加
--timeout=600参数延长超时时间 - 使用代理服务器(需符合企业网络政策)
- 考虑改用Azure Container Registry的异地复制功能
5.3 存储空间不足
监控ACR存储使用情况:
bash复制az acr show-usage --name myregistry --output table
清理旧镜像:
bash复制az acr run --registry myregistry \
--cmd "acr purge --filter 'ubuntu:.*' --ago 30d" \
/dev/null
6. 安全最佳实践
- 使用专用服务账号而非个人账号
- 为GitHub Actions配置最小权限的ACR令牌
- 开启ACR的内容信任(Content Trust)功能
- 定期审计同步日志:
bash复制grep "ERROR" sync.log | awk '{print $4}' | sort | uniq -c
这套方案在我们生产环境稳定运行了半年多,同步了超过200个常用基础镜像。最大的收益是构建速度提升了60%,因为所有CI/CD流程都直接从本地ACR拉取镜像。对于有严格合规要求的企业,还可以扩展加入镜像扫描步骤,在同步流程中自动完成安全检测。
