Created
January 2, 2025 02:01
-
-
Save aweffr/de5e0689843e589d834e01cdd4f15dfb to your computer and use it in GitHub Desktop.
该脚本用于将Docker镜像传输到腾讯云容器注册中心CCR。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
该脚本用于将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