Docker Registry 간 이미지 이전하기: 모든 태그 자동 복사 방법

개발 환경이 확장됨에 따라, 한 Registry에 저장된 여러 이미지들을 다른 Registry로 이전해야 하는 경우가 있습니다. 이번 글에서는 단일 태그뿐 아니라, 여러 태그가 있는 이미지까지 자동으로 복사하는 스크립트를 작성하고 실행하는 과정을 소개합니다.

작업 환경

  • 출발지 Registry (Source): SRC_REGISTRY="source-registry.example.com:5000"
  • 목적지 Registry (Destination): DEST_REGISTRY="destination-registry.example.com:5000"
  • JSON 파일: repositories.json
    이 파일에는 이전할 저장소(repository) 이름들이 배열 형식으로 저장되어 있습니다. json복사{ "repositories": [ "example-api", "sample-api", "dashboard-app" ] }

참고: 스크립트를 실행하는 호스트는 두 Registry 모두 네트워크로 접근 가능한 환경이어야 합니다.

스크립트 설명

이 스크립트는 다음 단계로 구성되어 있습니다.

  1. JSON 파일 파싱:
    jq 도구를 사용하여 repositories.json 파일에서 저장소(repository) 목록을 추출합니다.
  2. 태그 목록 가져오기:
    각 저장소마다 Docker Registry HTTP API를 통해 태그 목록을 가져옵니다. bash복사curl -s https://$SRC_REGISTRY/v2/$repo/tags/list | jq -r '.tags[]' 이 과정에서 각 저장소가 존재하지 않거나 태그가 없으면 건너뛰도록 처리합니다.
  3. 이미지 복사 처리:
    각 태그에 대해 아래 작업을 반복합니다.
    • 소스 Registry에서 이미지를 pull
    • 이미지에 새로운 태그를 지정하여 목적지 Registry 형식으로 재설정
    • 목적지 Registry로 이미지를 push

전체 스크립트는 아래와 같습니다.

전체 스크립트

#!/bin/bash
set -e

# 소스와 대상 레지스트리 도메인 (포트 포함)
SRC_REGISTRY="source-registry.example.com:5000"
DEST_REGISTRY="destination-registry.example.com:5000"

# JSON 파일 이름 (예: repositories.json)
JSON_FILE="repositories.json"

# JSON 파일에서 repository 목록을 읽어옵니다.
REPOSITORIES=$(jq -r '.repositories[]' "$JSON_FILE")

for repo in $REPOSITORIES; do
    echo "=========================="
    echo "Processing repository: $repo"
    echo "=========================="

    # 소스 레지스트리 API를 이용해 태그 목록을 가져옵니다.
    RESPONSE=$(curl -s https://$SRC_REGISTRY/v2/$repo/tags/list)
    echo "Raw response for $repo: $RESPONSE"
    TAGS=$(echo "$RESPONSE" | jq -r '.tags[]')

    # 태그가 없다면 건너뜁니다.
    if [ -z "$TAGS" ]; then
        echo "No tags found for $repo. Skipping..."
        continue
    fi

    for tag in $TAGS; do
        echo "Copying $repo:$tag"
        # 소스에서 이미지 pull
        docker pull $SRC_REGISTRY/$repo:$tag
        # 태그 재설정
        docker tag $SRC_REGISTRY/$repo:$tag $DEST_REGISTRY/$repo:$tag
        # 대상 레지스트리에 push
        docker push $DEST_REGISTRY/$repo:$tag
    done
done

echo "All repositories processed."

스크립트 실행 결과

스크립트를 실행하면, 각 저장소의 모든 태그가 순차적으로 처리되어 출발지 Registry에서 이미지를 가져와 목적지 Registry에 복사됩니다.
예를 들어, example-api 저장소에서는 다음과 같이 태그별 이미지 복사가 진행됩니다.

==========================
Processing repository: example-api
==========================
Copying example-api:latest
...
All repositories processed.

마무리 및 고찰

이 방식은 다음과 같은 점에서 유용합니다.

  • 자동화: 수동으로 태그마다 작업할 필요 없이 스크립트를 단 한 번 실행하면 모든 태그를 처리할 수 있습니다.
  • 유연성: 스크립트 내 변수들을 수정하여 원하는 Registry 도메인이나 JSON 파일 등을 쉽게 변경할 수 있습니다.
  • 대안 도구: 네트워크 접근 및 인증 설정에 따라 Skopeo와 같은 도구를 사용하여 Registry 간 이미지를 직접 복사할 수도 있습니다.

여러분의 환경에 맞게 스크립트를 커스터마이즈하여 사용해 보시기 바랍니다. 이 글이 Docker Registry 간 이미지 이전 작업에 도움이 되길 바라며, 질문이나 의견은 댓글로 남겨 주세요!

Leave a Comment