hack/images/migrate_ecr.py (46 lines of code) (raw):
import subprocess
import os
# AWS ECR configuration
AWS_REGION = ''
AWS_ACCOUNT_ID = ''
IMAGES_FILE_PATH = "images.txt" # Path to the images file
def run_command(command):
"""Run a shell command and return the output."""
result = subprocess.run(command, shell=True, capture_output=True, text=True)
if result.returncode != 0:
print(f"Command failed: {command}\nError: {result.stderr}")
raise Exception(result.stderr)
return result.stdout.strip()
def ecr_repository_exists(repo_name):
"""Check if an ECR repository exists."""
try:
run_command(f"aws ecr describe-repositories --repository-names {repo_name} --region {AWS_REGION}")
print(f"Repository {repo_name} already exists.")
return True
except Exception:
print(f"Repository {repo_name} does not exist. It will be created.")
return False
def create_ecr_repository(repo_name):
"""Create an ECR repository if it doesn't exist."""
run_command(f"aws ecr create-repository --repository-name {repo_name} --region {AWS_REGION}")
print(f"Created repository {repo_name}.")
def login_to_ecr():
"""Authenticate Docker to the ECR registry."""
login_command = f"aws ecr get-login-password --region {AWS_REGION} | docker login --username AWS --password-stdin {AWS_ACCOUNT_ID}.dkr.ecr.{AWS_REGION}.amazonaws.com"
run_command(login_command)
print("Logged into AWS ECR.")
def push_image_to_ecr(source_image, target_image):
"""Tag and push the image to ECR."""
run_command(f"docker pull {source_image}")
run_command(f"docker tag {source_image} {target_image}")
run_command(f"docker push {target_image}")
print(f"Pushed {target_image} to ECR.")
def process_images():
"""Read images from file, check/create repos, and push images to ECR."""
login_to_ecr()
with open(IMAGES_FILE_PATH, 'r') as file:
for line in file:
source_image = line.strip()
if source_image:
# Extract repo path and tag (e.g., 'alpine/curl' from 'docker.io/alpine/curl:3.14')
repo_path = '/'.join(source_image.split('/')[1:]).split(':')[0]
tag = source_image.split(':')[-1]
# Define ECR repository name and full ECR image path
repo_name = repo_path
ecr_image = f"{AWS_ACCOUNT_ID}.dkr.ecr.{AWS_REGION}.amazonaws.com/{repo_name}:{tag}"
# Check if the repository exists, if not, create it
if not ecr_repository_exists(repo_name):
create_ecr_repository(repo_name)
# Push the image to ECR
push_image_to_ecr(source_image, ecr_image)
if __name__ == "__main__":
process_images()