Skip to content

Instantly share code, notes, and snippets.

@aweffr
Created January 2, 2025 02:01
Show Gist options
  • Save aweffr/de5e0689843e589d834e01cdd4f15dfb to your computer and use it in GitHub Desktop.
Save aweffr/de5e0689843e589d834e01cdd4f15dfb to your computer and use it in GitHub Desktop.
该脚本用于将Docker镜像传输到腾讯云容器注册中心CCR。
"""
该脚本用于将Docker镜像传输到腾讯云容器注册中心CCR。
用法示例:
python transfer_docker_image_to_ccr.py <镜像名称> [--dry-run] [--arch <架构>]
参数:
<镜像名称>: 要传输的Docker镜像名称。
--dry-run:打印命令而不执行。
--arch <架构>: 镜像的架构,支持'arm64'和'amd64',默认为'amd64'。
"""
import sys
import subprocess
import os
import json
import argparse
import json
CCR_DOCKER_REGISTRY = "ccr.ccs.tencentyun.com"
CCR_DOCKER_USERNAME = os.getenv("CCR_DOCKER_USERNAME", "")
CCR_DOCKER_PASSWORD = os.getenv("CCR_DOCKER_PASSWORD", "")
def log(message: str):
if CCR_DOCKER_PASSWORD and CCR_DOCKER_PASSWORD in message:
message = message.replace(CCR_DOCKER_PASSWORD, "********")
print(message, file=sys.stdout, flush=True)
def run_command(command: str, dry_run: bool = False):
log(f"Running command: {command}")
if dry_run:
return 0
return subprocess.call(command, shell=True)
def docker_check_already_login():
docker_config = os.path.expanduser("~/.docker/config.json")
if not os.path.exists(docker_config):
return False
with open(docker_config, "r") as f:
config = json.load(f)
return CCR_DOCKER_REGISTRY in config.get("auths", {})
def docker_login(dry_run: bool = False):
if not CCR_DOCKER_PASSWORD or not CCR_DOCKER_USERNAME:
if docker_check_already_login():
log("Already logged in to Docker, password is not required.")
return 0
else:
log("Docker password or username is not set")
return 1
log("Logging in to Docker...")
command = f"echo \"{CCR_DOCKER_PASSWORD}\" | docker login {CCR_DOCKER_REGISTRY} -u {CCR_DOCKER_USERNAME} --password-stdin"
return run_command(command, dry_run=dry_run)
def transfer_docker_image(image_name: str, arch: str = "amd64", dry_run: bool = False):
log(f"transfer_docker_image called, image_name: {image_name}, arch: {arch}, dry_run: {dry_run}")
ret_code = docker_login(dry_run=dry_run)
if ret_code != 0:
log(f"Failed to login to Docker, return code: {ret_code}")
return
if "/" in image_name:
base_image_name = image_name.split("/")[-1]
else:
base_image_name = image_name
image_name_new = f"ccr.ccs.tencentyun.com/aweffr-main/{base_image_name}"
if arch != "amd64":
image_name_new += f"-{arch}"
log(f"Transferring image {image_name} to {image_name_new}...")
docker_pull_command = f"docker pull --platform linux/{arch} {image_name}"
ret_code = run_command(docker_pull_command, dry_run=dry_run)
if ret_code != 0:
log(f"Failed to pull image, return code: {ret_code}")
return
ret_code = run_command(f"docker tag {image_name} {image_name_new}", dry_run=dry_run)
if ret_code != 0:
log(f"Failed to tag image, return code: {ret_code}")
return
ret_code = run_command(f"docker push {image_name_new}", dry_run=dry_run)
if ret_code != 0:
log(f"Failed to push image, return code: {ret_code}")
return
log(f"Successfully transferred image {image_name} to {image_name_new}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Transfer Docker image to Tencent Cloud Registry')
parser.add_argument('image_name', help='Name of the Docker image to transfer')
parser.add_argument('--dry-run', action='store_true', help='Print commands without executing them')
parser.add_argument(
'--arch', help='Architecture of the image', choices=['arm64', 'amd64'], default='amd64'
)
args = parser.parse_args()
transfer_docker_image(args.image_name, arch=args.arch, dry_run=args.dry_run)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment