Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

GitHub Container Registry 사용하기

작년 말 Docker Hub가 정책을 변경해서 6개월 동안 활동이 없으면 이미지를 제거하겠다고 발표했다. 사용자 반응이 커서 이는 2021년 중순까지 유예되었지만 (Docker Inc의 사정이 그리 좋지 않아 보이기 때문에...) 이는 올해 적용될 것이고 이미 API rate 제한은 적용된 상태이다.

API rate 제한은 회사에서 좀 더 민감한 정책이고(CI 빌드 등이 깨질 수 있어서...) Docker 이미지 보관 정책은 회사에서도 신경 쓰일 일이지만 개인으로도 신경 쓰이는 정책이다. 개인 목적으로 올려둔 이미지를 6개월 정도 업데이트 안 하는 일은 충분히 가능해 보이기 때문이다.

GitHub에서는 GitHub Packages라는 이름으로 Docker 이미지를 지원하고 있었으나 작년 GitHub Container Registry가 발표되었고 GitHub Packages의 Docker 이미지는 Container Registry로 대체되었다. 아직은 둘 다 지원하므로 Container Registry로 마이그레이션 하는 방법을 안내하고 있다.

이제 이미지를 GitHub Container Registry에서 관리해볼까 해서 테스트를 해봤다.

GitHub Container Registry

기존 Packages에서는 docker.pkg.github.com 주소를 사용했지만, Container Registry는 ghcr.io를 사용한다.

Container Registry를 사용하려면 엑세스 토큰이 필요하다. https://github.com/settings/tokens에서 패키지에 대한 권한을 가진 토큰을 생성해야 한다.

  • write:packages
  • read:packages
  • delete:packages

GitHub 엑세스 토큰 스코프 설정

이 토큰을 TOKEN.txt 파일에 저장했다고 하면 다음과 같이 로그인할 수 있다.

$ cat TOKEN.txt | docker login https://ghcr.io -u outsideris --password-stdin
Login Succeeded

테스트로 사용할 node-hello:latest 이미지를 사용해서 ghcr.io/outsideris/image-test:0.1이라는 태그를 추가한다. Container Registry는 ghcr.io/<OWNER>/<IMAGE-NAME>의 형식을 사용한다. 참고로 Container Registry는 Packages와 달리 저장소에 생기는 게 아니라 사용자나 조직 같은 계정 밑에서 관리가 되기 때문에 주소에 저장소 이름을 들어가지 않는다.

$ docker tag node-hello:latest ghcr.io/outsideris/image-test:0.1

로그인을 했으므로 이 이미지를 푸시할 수 있다.

$ docker push ghcr.io/outsideris/image-test:0.1
The push refers to repository [ghcr.io/outsideris/image-test]
e6d7ed1096fd: Pushed
11d4310b6d41: Pushed
d2edc8fba241: Pushed
fdba6a5d9dd7: Pushed
07700abd910e: Pushed
edfb8ee7c346: Pushed
aa817488a0dd: Pushed
74825a980b6d: Pushed
1fb0a31fe7c2: Pushed
0.1: digest: sha256:b32559b286fa7cf5d69d9ffa35857518b8814cab61ae2091a25a1ac75546f7d4 size: 2215


Container Registry 활성화

아직 Container Registry가 베타 상태이기 때문에 Feature preview에서 활성화해야 사용할 수 있다. 프로필의 하위 메뉴에서 Feature preview 메뉴를 찾을 수 있다.

Feature preview 메뉴

다음과 같이 "Improved container support"를 활성화해야 사용할 수 있다.

Feature preview의 컨테이터 서프트 활성화

이를 활성화하지 않으면 이미지를 푸시할 때 다음과 같이 오류가 발생한다.

$ docker push ghcr.io/outsideris/image-test:0.1
The push refers to repository [ghcr.io/outsideris/image-test]

denied: failed_precondition: Improved container support has not been enabled for 'outsideris'. Learn more: https://docs.github.com/packages/getting-started-with-github-container-registry/enabling-improved-container-support

컨테이너 이미지 저장소 관리

이렇게 푸시한 이미지는 자신의 계정의 패키지 탭에서 볼 수 있다.(여기서는 https://github.com/outsideris?tab=packages)

등록된 컨테이너 이미지

방금 올린 이미지가 등록된 것을 볼 수 있고 Private으로 등록되어 있다. 이미지를 클릭해서 들어가면 올리온 버전과 pull 방법 등을 볼 수 있다.

컨테이너 이지미 정보가 나온 상세 화면

하단을 보면 이미지를 특정 저장소를 연결하는 방법이 나와 있다.

컨테이너 이미지의 Link this package to a repository 안내

UI에서 직접 눌러서 저장소와 연결할 수도 있지만, 안내에 나온 대로 Docker 이미지에 LABEL을 추가해서 자동으로 연결되도록 할 수 있다.

LABEL org.opencontainers.image.source https://github.com/outsideris/github-actions-docker-push-test

org.opencontainers.image.source LABEL에 원하는 저장소의 주소를 입력하면 해당 저장소의 README 파일을 저장소에 표시할 수 있고 해당 저장소의 discussion와 이슈의 링크도 추가해 준다.

연결된 GitHub 저장소의 README

패키지 설정에 들어가면 누구나 이미지를 다운로드 받을 수 있도록 가시성을 Public으로 변경할 수 있다.

컨테이너 이미지의 가시성 설정

docker 로그인을 하지 않아도 다운로드할 수 있는 것을 볼 수 있다.

$ docker pull ghcr.io/outsideris/image-test:0.2
0.2: Pulling from outsideris/image-test
Digest: sha256:fb2c837d15e4b9b80ef0df3e561e1a93dcd2b2afddb8de46c211d550c2918efa
Status: Image is up to date for ghcr.io/outsideris/image-test:0.2
ghcr.io/outsideris/image-test:0.2

Private로 설정되어 있을 때는 로그인하지 않으면(혹은 권한이 없으면) 당연히 다음과 같은 오류가 발생한다.

Error response from daemon: Head https://ghcr.io/v2/outsideris/image-test/manifests/0.2: unauthorized
2021/01/26 19:33 2021/01/26 19:33