깃허브 컨테이너 레지스트리 시작

About GitHub Container Registry

개요

가능한 깃허브 계정

accounts
GitHub Free
GitHub Pro
GitHub Free for organizations
GitHub Team
GitHub Enterprise Cloud
GitHub Enterprise Server 2.22
GitHub One.

불가능한 깃허브 계정

accounts
private repositories of Github with legacy per-repository plan
accounts using legacy per-repository plan

컨테이너 레지스트리로 할 수 있는 것

지원하는 이미지 형식

Docker Image Manifest V2, Schema 2

Open Container Initiative (OCI) Specifications

컨테이너 이미지 공개 여부와 접근 권한

Permission role Access description
Read Can download package.
Can read package metadata.
Write Can upload and download this package.
Can read and write package metadata.
Admin Can upload, download, delete, and manage this package.
Can read and write package metadata.
Can grant package permissions.

향상된 컨테이너 지원 활성화

개인 계정 위한 GitHub Container Registry 활성화

  1. 우측 상단 프로필 클릭 → Feature preview 클릭
  2. Improved container support 활성화

조직 계정 위한 GitHub Container Registry 활성화

GitHub Container Registry 핵심 개념

GitHub Container Registry

패키지

컨테이너

컨테이너 이미지

도커 컨테이너

깃허브 컨테이너 레지스트리로 컨테이너 이미지 관리하기

컨테이너 접근 제어 및 공개 여부 구성하기

개인 계정 위한 컨테이너 이미지 접근 구성하기

  1. Github → 우측 상단 프로필 → Your profile 클릭
  2. 우측의 Packages 탭 클릭

도커 이미지 Push/Pull

GitHub Container Registry에 인증

PAT와 권한

절차

  1. 수행하려는 작업에 맞는 권한을 가진 PAT 생성. 조직에서 SSO를 요구하면, 토큰에 대하여 반드시 SSO 활성화. PAT의 생성 방법

WARNING > write package를 선택하면, PAT 생성 시 repo 권한을 선택 해제한다 PATrepo 권한을 추가하면, 저장소 내의 모든 협력자(collaborator)들에게 접근할 수 있다

scopes 목적
read package 컨테이너 이미지 다운로드 및 메타데이터 읽기
write package 컨테이너 이미지 다운로드/업로드 및 메타데이터 읽기/쓰기
delete package 컨테이너 이미지 삭제
  1. PAT를 환경 변수로 저장하는 것을 추천
$ export CR_PAT=YOUR_TOKEN
  1. 사용하는 컨테이너의 cli 사용하여 ghcr.ioGitHub Container Registry 서비스이 sign in
$ echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin
> Login Succeeded
# ~/.bashrc 에 export CR_PAT=<PAT> 저장 후, source ~/.bashrc
$ echo $CR_PAT | docker login ghcr.io -u aimpugn --password-stdin
WARNING! Your password will be stored unencrypted in {$HOME}/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

컨테이너 이미지 push

최신 버전의 이미지 psuh

$ docker push ghcr.io/{OWNER}/{IMAGE-NAME}:latest

특정 버전의 이미지 psuh

$ docker push ghcr.io/{OWNER}/{IMAGE-NAME}:2.5

에러

하지만 push 테스트 결과 아래와 같은 에러 발생

$ docker push ghcr.io/aimpugn/pgsb:1.1.0
The push refers to repository [ghcr.io/aimpugn/pgsb]
An image does not exist locally with the tag: ghcr.io/aimpugn/pgsb

images 목록을 보면 “ghcr.io/aimpugn/pgsb”라고 태그 되어 있는 이미지가 없다. 그럼 모두 이렇게 태그 해야 하는가?

$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
pgsb                       1.1.0               9dab490fcaf8        2 days ago          324MB
golang                     1.15.5-alpine3.12   1de1afaeaa9a        2 weeks ago         299MB
<none>                     <none>              1f1bfd282304        5 months ago        40.6MB
jaegertracing/all-in-one   latest              515cf0d4394e        5 months ago        48.3MB
hello-world                latest              bf756fb1ae65        11 months ago       13.3kB
jaegertracing/all-in-one   1.6                 200b59542ab6        2 years ago         40.6MB
qnib/httpcheck             latest              3df1ccc70b53        4 years ago         286MB

stackoverflow 검색해보면, 기본 레지스트리(docker hub)가 아닌 곳에 push 할 경우 regitry nameport를 포함해야 한다

Successfully built 4634d3bc9e76
Successfully tagged ghcr.io/aimpugn/pgsb:1.1.0

이를 push하면 다음과 같이 push가 된다

$ docker push ghcr.io/aimpugn/pgsb:1.1.0
The push refers to repository [ghcr.io/aimpugn/pgsb]
c536b765fbc6: Pushed
aa32009142e4: Pushed
d7e330f94ce7: Pushed
72f3b72640b9: Pushed
27fc4e020136: Pushed
c07f8a820edc: Pushed
ace0eda3e3be: Pushed
size: 1787