조직 저장소를 CSV로 내보내기

조직 저장소를 CSV로 내보내기 (Export organization repositories to CSV)

Docker Hub 조직의 전체 저장소 목록(비공개 저장소 포함)을 Docker Hub API와 Personal Access Token을 사용해 CSV 파일로 내보내는 방법을 배워볼게요.

출처: 문서

본문

이 가이드는 관리자 계정의 Personal Access Token(PAT)을 사용해 Docker Hub API에 인증하고, 보고나 분석을 위해 저장소 세부 정보를 CSV 파일로 내보내는 방법을 보여줘요. 내보내는 데이터에는 저장소 이름, 공개 상태, 마지막 업데이트 날짜, 풀 수, 별점 수가 포함돼요.

사전 요구 사항

시작하기 전에 다음이 있는지 확인해요:

  • Docker Hub 조직에 대한 관리자(Administrator) 접근 권한
  • API 요청을 위한 curl 설치
  • JSON 파싱을 위한 jq 설치
  • CSV를 볼 스프레드시트 애플리케이션

Personal Access Token 만들기

조직의 저장소에 접근할 수 있는 사용자 계정에서 Personal Access Token을 만들어요. 토큰을 만들 때 저장소를 나열하려면 최소한 Read-only 접근 권한을 선택해요.

중요: 조직의 구성원인 사용자 계정의 PAT를 사용해요. owner 역할을 가진 사용자는 모든 조직 저장소를 내보낼 수 있어요. 구성원은 접근 권한이 있는 저장소만 내보낼 수 있어요.

Docker Hub API로 인증하기

Personal Access Token을 이후 API 요청에 사용할 JWT bearer 토큰으로 교환해요. Docker Hub 사용자 이름, 조직 이름, Personal Access Token을 변수로 설정해요:

USERNAME="<your-docker-username>"
ORG="<org-name>"
PAT="<your_personal_access_token>"

인증 엔드포인트를 호출해 JWT를 받아요:

TOKEN=$( curl -s https://hub.docker.com/v2/auth/token \
  -H 'Content-Type: application/json' \
  -d "{\"identifier\":\"$USERNAME\",\"secret\":\"$PAT\"}" \
  | jq -r '.access_token' )

토큰이 성공적으로 받아졌는지 확인해요:

$ echo "Got JWT: ${#TOKEN} chars"

이 JWT를 모든 후속 API 호출의 Authorization 헤더에서 Bearer 토큰으로 사용해요.

모든 저장소 가져오기

Docker Hub API는 저장소 목록을 페이지네이션해요. 이 스크립트는 모든 페이지를 가져와 결과를 결합해요. 페이지 크기와 초기 API 엔드포인트를 설정해요:

PAGE_SIZE=100
URL="https://hub.docker.com/v2/namespaces/$ORG/repositories?page_size=$PAGE_SIZE"

모든 결과를 페이지네이션해요:

ALL=$( while [ -n "$URL" ] && [ "$URL" != "null" ]; do
  RESP=$( curl -s "$URL" -H "Authorization: Bearer ***" )
  echo "$RESP" | jq -c '.results[]'
  URL=$( echo "$RESP" | jq -r '.next' )
done | jq -s '.' )

가져온 저장소 수를 확인해요:

$ echo "$ALL" | jq 'length'

이 스크립트는 페이지네이션이 완료될 때까지 각 응답에서 다음 URL을 계속 요청해요.

CSV로 내보내기

스프레드시트 애플리케이션에서 열 수 있는 저장소 세부 정보가 담긴 CSV 파일을 생성해요. 다음 명령을 실행해 repos.csv를 만들어요:

echo "$ALL" | jq -r '
  (["namespace","name","is_private","last_updated","pull_count","star_count"] | @csv),
  (.[] | [ .namespace, .name, .is_private, .last_updated, (.pull_count//0), (.star_count//0) ] | @csv)
' > repos.csv

내보내기가 완료되었는지 확인해요:

$ echo "Rows:" $( wc -l < repos.csv )

선호하는 스프레드시트 애플리케이션에서 repos.csv 파일을 열어 저장소 데이터를 보고 분석해요.

문제 해결

공개 저장소만 나타나는 경우

Personal Access Token과 연결된 Docker Hub 계정이 조직의 비공개 저장소에 접근 권한이 없을 수 있어요. 해결하려면:

  • 계정이 조직의 구성원인지 확인
  • 계정에 적절한 권한(owner 또는 member 역할)이 있는지 확인
  • Personal Access Token이 충분한 접근 권한을 가지고 있는지 확인
  • JWT를 다시 생성하고 내보내기를 다시 시도

API가 403 또는 누락된 필드를 반환하는 경우

Personal Access Token 자체가 아니라 /v2/auth/token 엔드포인트의 JWT를 Authorization 헤더의 Bearer 토큰으로 사용하고 있는지 확인해요. 인증을 확인해요:

$ curl -s "https://hub.docker.com/v2/namespaces/$ORG/repositories?page_size=1" \
  -H "Authorization: Bearer ***" | jq

오류가 반환되면 인증 단계를 다시 실행해 새 JWT를 받아요.

더 알아보기 (Learn more)