🐳 Docker Hub 鏡像一鍵同步至阿里云 ACR
本腳本用于 從 Docker Hub 拉取鏡像并推送到阿里云容器鏡像服務(ACR)。
它通過 Python 的 docker
SDK 封裝了完整流程:拉取 → 重命名 → 登錄 → 推送,并在控制臺實時輸出進度日志,方便運維和開發人員快速完成鏡像同步。
? 功能特點
- 支持從 Docker Hub 拉取任意鏡像(如
nginx:latest
) - 自動重命名為 阿里云 ACR 標準鏡像格式
- 支持 公網地址 和 內網 VPC 地址 兩種形式
- 全過程輸出拉取、推送進度,方便排錯
- 命令行參數友好,可靈活調用
🚀 使用方法
-
確保本地安裝了 Docker 并已啟動
-
安裝依賴:
pip install docker
-
執行腳本(例如拉取
nginx:latest
):python ack-reg-sync.py nginx:latest
?? 配置說明
在腳本中可修改以下固定參數:
acr_registry
:阿里云 ACR 地址(如registry.cn-shenzhen.aliyuncs.com
)acr_namespace
:命名空間(倉庫名)acr_username
:阿里云賬號或 RAM 用戶acr_password
:對應密碼或臨時令牌
import docker
import argparse # 新增導入def pull_from_dockerhub_and_push_to_acr(dockerhub_image: str,acr_registry: str,acr_namespace: str,acr_username: str,acr_password: str
):"""從 Docker Hub 拉取鏡像(顯示進度),推送到阿里云 ACR:param dockerhub_image: Docker Hub 鏡像名稱(如 `nginx:latest`):param acr_registry: 阿里云 ACR 注冊表地址(如 `registry.cn-hangzhou.aliyuncs.com`):param acr_namespace: ACR 命名空間(倉庫名稱):param acr_username: 阿里云賬號或 RAM 用戶名:param acr_password: 阿里云密碼或臨時令牌"""# 初始化 Docker 客戶端client = docker.from_env()# 1. 從 Docker Hub 拉取鏡像(顯示進度)print(f"從 Docker Hub 拉取鏡像: {dockerhub_image}")pull_logs = client.api.pull(dockerhub_image,stream=True, # 啟用流式輸出decode=True # 解析日志為字典)# 實時顯示拉取進度for log in pull_logs:if "progress" in log:print(f"層 {log['id']}: {log['status']} "f"{log['progress'] if 'progress' in log else ''}")else:print(f"{log['status']} {log.get('id', '')}".strip())# 2. 重命名為阿里云 ACR 格式image_with_tag = dockerhub_image.split('/')[-1]target_image = f"{acr_registry}/{acr_namespace}/{image_with_tag}"alias_image = f"registry-vpc.cn-shenzhen.aliyuncs.com/{acr_namespace}/{image_with_tag}"print(f"\n重命名鏡像為: {target_image}")image = client.images.get(dockerhub_image)image.tag(target_image)# 3. 登錄阿里云 ACRprint("登錄阿里云 ACR...")client.login(username=acr_username,password=acr_password,registry=acr_registry)# 4. 推送鏡像到阿里云 ACRprint(f"推送鏡像到阿里云 ACR: {target_image}")push_logs = client.images.push(target_image,stream=True,decode=True)# 顯示推送進度(可選)for log in push_logs:if "error" in log:raise Exception(f"推送失敗: {log['error']}")print(log.get("status", ""), log.get("progress", ""))print(f"\n阿里云公網地址為: {target_image}")print(f"\n阿里云內網地址為: {alias_image}")print("\n操作完成!")if __name__ == "__main__":# 配置參數解析器parser = argparse.ArgumentParser(description='從Docker Hub拉取鏡像并推送到阿里云ACR')parser.add_argument('dockerhub_image', type=str, help='Docker Hub鏡像名稱(如 nginx:latest)')# 其他固定參數args = parser.parse_args()# 固定配置的其他參數acr_registry = "registry.cn-shenzhen.aliyuncs.com" # 阿里云 ACR 地址acr_namespace = "xxxxx" # ACR 命名空間(倉庫名)acr_username = "xxxxxxxxxx" # 阿里云賬號acr_password = "xxxxxxxxxx" # 密碼或臨時令牌# 執行操作pull_from_dockerhub_and_push_to_acr(args.dockerhub_image, # 使用命令行參數acr_registry,acr_namespace,acr_username,acr_password)