如何使用image-syncer 实现 Docker Hub 到 Azure ACR 的自动化镜像同步
<!-- truncate --> HagiCode 项目使用 Docker 镜像作为核心运行时组件,主要镜像托管在 Docker Hub。随着项目发展和 Azure 环境部署需求的增加,我们遇到了以下痛点: 为解决这些问题,我们需要建立一个自动化的镜像同步机制,将 Docker Hub 的镜像定期同步到 Azure ACR,确保用户能够在 Azure 环境中获得更快的镜像拉取速度和更高的可用性。 我们正在开发 HagiCode——一款 AI 驱动的代码智能助手,让开发体验变得更智能、更便捷、更有趣。 智能——AI 全程辅助,从想法到代码,让编码效率提升数倍。便捷——多线程并发操作,充分利用资源,开发流程顺畅无阻。有趣——游戏化机制和成就系统,让编码不再枯燥,充满成就感。 项目正在快速迭代中,如果你对技术写作、知识管理或者 AI 辅助开发感兴趣,欢迎来 GitHub 看看。 在制定解决方案时,我们对比了多种技术方案: 我们采用 GitHub Actions + image-syncer 的自动化方案,实现从 Docker Hub 到 Azure ACR 的镜像同步。 在 GitHub 仓库设置中添加以下 Secrets: 在 .github/workflows/sync-docker-acr.yml 中配置工作流: 以下是实际运行的工作流配置(.github/workflows/sync-docker-acr.yml): 此配置表示将 docker.io/newbe36524/hagicode 的所有标签同步到 hagicode.azurecr.io/hagicode 在 GitHub 仓库的 Settings → Secrets and variables → Actions 中配置: 解决方案: 解决方案: 解决方案: 修改 images.yaml 配置文件: 在 images.yaml 中添加多行配置: 在工作流中添加通知步骤: 在工作流中添加标签过滤逻辑: 通过本文介绍的方法,我们成功实现了从 Docker Hub 到 Azure ACR 的自动化镜像同步。这个方案利用 GitHub Actions 的定时触发和手动触发功能,结合 image-syncer 的增量同步和错误处理机制,确保了镜像的及时同步和一致性。 我们还讨论了安全最佳实践、性能优化、故障排查等方面的内容,帮助用户更好地管理和维护这个同步机制。希望本文能够为需要在 Azure 环境中部署 Docker 镜像的开发者提供有价值的参考。 感谢您的阅读,如果您觉得本文有用,快点击下方点赞按钮👍,让更多的人看到本文。 本内容采用人工智能辅助协作,经本人审核,符合本人观点与立场。实现 Docker Hub 到 Azure ACR 的自动化镜像同步
本文介绍了如何使用 GitHub Actions 和 image-syncer 工具,实现 Docker Hub 镜像到 Azure Container Registry 的自动化同步,解决了国内及部分 Azure 区域访问 Docker Hub 速度慢的问题,提升了镜像的可用性和 Azure 环境的部署效率。
背景/引言
关于 HagiCode
技术方案对比
1. image-syncer(最终选择)
2. Docker CLI
3. Azure CLI
架构设计决策
决策 1:同步频率设置为每日 UTC 00:00
决策 2:同步所有镜像标签
决策 3:使用 GitHub Secrets 存储认证信息
风险评估与缓解
风险 1:Azure ACR 认证信息泄露
风险 2:同步失败导致镜像不一致
风险 3:资源消耗过大
核心解决方案
实施步骤
1. 准备阶段
2. 配置 GitHub Secrets
3. 创建 GitHub Actions 工作流
4. 工作流执行流程
GitHub Actions 工作流实现
name: Sync Docker Image to Azure ACR
on:
schedule:
- cron: "0 0 * * *" # 每天 UTC 00:00
workflow_dispatch: # 手动触发
push:
branches: [publish]
permissions:
contents: read
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download image-syncer
run: |
# 下载 image-syncer 二进制文件
wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.5.5/image-syncer-v1.5.5-linux-amd64.tar.gz
tar -zxvf image-syncer-v1.5.5-linux-amd64.tar.gz
chmod +x image-syncer
- name: Create auth config
run: |
# 生成认证配置文件 (YAML 格式)
cat > auth.yaml <<EOF
hagicode.azurecr.io:
username: "${{ secrets.AZURE_ACR_USERNAME }}"
password: "${{ secrets.AZURE_ACR_PASSWORD }}"
EOF
- name: Create images config
run: |
# 生成镜像同步配置文件 (YAML 格式)
cat > images.yaml <<EOF
docker.io/newbe36524/hagicode: hagicode.azurecr.io/hagicode
EOF
- name: Run image-syncer
run: |
# 执行同步 (使用新版 --auth 和 --images 参数)
./image-syncer --auth=./auth.yaml --images=./images.yaml --proc=10 --retries=3
- name: Upload logs
if: always()
uses: actions/upload-artifact@v4
with:
name: sync-logs
path: image-syncer-*.log
retention-days: 7配置说明
1. 触发条件
2. 认证配置 (auth.yaml)
hagicode.azurecr.io:
username: "${{ secrets.AZURE_ACR_USERNAME }}"
password: "${{ secrets.AZURE_ACR_PASSWORD }}"3. 镜像同步配置
docker.io/newbe36524/hagicode: hagicode.azurecr.io/hagicode4. image-syncer 参数
GitHub Secrets 配置清单
Secret 名称 描述 示例值 获取方式 AZURE_ACR_USERNAME Azure ACR 用户名 hagicode Azure Portal → ACR → Access keys AZURE_ACR_PASSWORD Azure ACR 密码 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Azure Portal → ACR → Access keys → Password 使用说明
1. 手动触发同步
2. 查看同步日志
3. 验证同步结果
# 登录到 Azure ACR
az acr login --name hagicode
# 列出镜像及其标签
az acr repository show-tags --name hagicode --repository hagicode --output table注意事项和最佳实践
1. 安全建议
2. 性能优化
3. 故障排查
问题 1:认证失败
Error: failed to authenticate to hagicode.azurecr.io问题 2:网络超时
Error: timeout waiting for response问题 3:镜像同步不完整
Warning: some tags failed to sync4. 监控和告警
常见问题和解决方案
Q1: 如何同步特定标签而不是所有标签?
# 仅同步 latest 和 v1.0 标签
docker.io/newbe36524/hagicode:latest: hagicode.azurecr.io/hagicode:latest
docker.io/newbe36524/hagicode:v1.0: hagicode.azurecr.io/hagicode:v1.0Q2: 如何同步多个镜像仓库?
docker.io/newbe36524/hagicode: hagicode.azurecr.io/hagicode
docker.io/newbe36524/another-image: hagicode.azurecr.io/another-imageQ3: 同步失败后如何重试?
Q4: 如何查看同步的详细进度?
Q5: 同步需要多长时间?
扩展功能建议
1. 添加同步通知
- name: Notify on success
if: success()
run: |
echo "Docker images synced successfully to Azure ACR"2. 实现镜像标签过滤
- name: Filter tags
run: |
# 仅同步以 v 开头的标签
echo "docker.io/newbe36524/hagicode:v* : hagicode.azurecr.io/hagicode:v*" > images.yaml3. 添加同步统计报告
- name: Generate report
if: always()
run: |
echo "## Sync Report" >> $GITHUB_STEP_SUMMARY
echo "- Total tags: $(grep -c 'synced' image-syncer-*.log)" >> $GITHUB_STEP_SUMMARY
echo "- Sync time: ${{ steps.sync.outputs.duration }}" >> $GITHUB_STEP_SUMMARY总结
参考资料
互动引导
AI 辅助声明
元信息