개발 환경이 확장됨에 따라, 한 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 모두 네트워크로 접근 가능한 환경이어야 합니다.
스크립트 설명
이 스크립트는 다음 단계로 구성되어 있습니다.
- JSON 파일 파싱:
jq
도구를 사용하여repositories.json
파일에서 저장소(repository) 목록을 추출합니다. - 태그 목록 가져오기:
각 저장소마다 Docker Registry HTTP API를 통해 태그 목록을 가져옵니다. bash복사curl -s https://$SRC_REGISTRY/v2/$repo/tags/list | jq -r '.tags[]'
이 과정에서 각 저장소가 존재하지 않거나 태그가 없으면 건너뛰도록 처리합니다. - 이미지 복사 처리:
각 태그에 대해 아래 작업을 반복합니다.- 소스 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 간 이미지 이전 작업에 도움이 되길 바라며, 질문이나 의견은 댓글로 남겨 주세요!