Knowhow/Docker

DockerFile 내부에서 github private repository clone 하기

침닦는수건 2023. 6. 22. 15:21
반응형

DockerFile을 작성할 때, git clone 명령어를 포함해야 하는 경우가 종종 있다. 생성할 도커 이미지가 단순히 환경 구축용이고 컨테이너를 띄울 때 필요한 코드나 폴더들을 volume mount를 통해 연결해서 사용한다면 해당사항이 없겠지만, 도커 이미지를 이용해 환경+코드가 다 포함되어 있고 1회 실행용 컨테이너를 띄우고자 할 때는 자주 마주하게 된다. 

 

다른 말로 volume mount로 이것저것 덕지덕지 붙이는 것없이 도커 컨테이너를 이미 모든 것을 포함한 형태로 띄우고 싶으면 높은 확률로 DockerFile 내에 이런저런 git clone 명령어를 포함하게 된다.

 

문제는 open source일 경우, 권한 문제가 없기 때문에 그냥 RUN git clone 명령어가 오류없이 동작하지만 github private repository를 clone하고자 할 때 생긴다. 보통 개인 private repository도 있지만 회사나 연구실 private repository를 사용하고자 할 때 자주 마주한다.

 

본 글에서는 위 권한 문제를 풀고 DockerFile 안에 git clone을 박아넣는 여러 방법 중 하나인 .netrc 파일을 사용하는 방법을 소개하고자 한다. 다른 방법도 있는데 이것을 쓴 이유는 내 기준 가장 간단해서다.

 

보안 이슈는 netrc 파일이 노출되거나 docker 컨테이너 내에서 뒤적뒤적 거리면 netrc 파일을 찾을 수 있는 여지가 있어서 완벽한지는 모르겠다.

 

배경 지식

일단 검색하면 ssh-key를 이용한 방식 등 이런저런 것들이 뜨는데 지금 사용할 .netrc는 조금 낯설다. 그래서 간단히 설명을 하자면, .netrc는 "자동으로 ftp에 로그인하게 하는 역할"이다. 다른 말로 어떤 서버에 자동 로그인 열쇠 같은 파일이다. 

machine [서버 주소]
	login [사용자 계정]
	password [비밀번호]

위와 같이 달랑 세줄 적혀있는 그냥 파일이다. vim .netrc 로 직접 만들면 그만인 파일이다. 

 

방법

1. github personal access token 발급하기

지금 github repository 권한 문제이다 보니 private repository에 접근이 가능한 사람(혹은 조직)의 github token이 필요하다. github token은 비밀번호를 대체하는 정보 중 하나라고 보면 되는데 이 token 정보를 .netrc에 박아넣고 .netrc 파일을 도커 이미지 내에 복사해줌으르써 권한 문제를 푼다.

 

일단 권한있는 아이디로 github 로그인을 한다. 그리고 프로필을 눌러보면 위와 같이 탭이 열리는데 여기서 Settings에 들어간다.

 

이후 좌측에서 "< > Developer settings"에 한 번 더 들어간 뒤, "Personal access tokens"을 클릭한다.

 

그럼 위와 같이 2가지 선택지가 보일텐데 (2023.06.22 기준), Fine-grained tokens를 생성하면 된다. 

 

여기서 Fine-grained tokens와 Tokens (classic)의 차이가 궁금할 수 있는데 아래 링크를 참고하면 좋다.

 

https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#about-personal-access-tokens

 

Managing your personal access tokens - GitHub Docs

You can use a personal access token in place of a password when authenticating to GitHub in the command line or with the API.

docs.github.com

 

요약하자면 Fine-grained tokens는 기존 token의 상위 호환으로 새로 만드는 것인데 보안 기능이 강화되고 특정 repository만 지정해서 접근이 가능하는 기능이 있다. 아직은 기존 token만 지원되는 일부 기능들이 있긴 한데 웬만하면 Fine-grained tokens를 쓰면 된다. 

 

Fine-grained token 생성을 클릭하면 다음과 같은 화면이 뜨는데 차례대로 지정하면 된다. 당연하게도 DockerFile 내에서 clone하고 싶은 repository를 선택해야 한다. 보안을 위해 Expiration 을 지정하는 것을 추천한다.

 

생성이 완료되면 다음과 같은 긴 값을 얻을 수 있다.

이 값이 .netrc 파일 내에 password 탭에 들어가는 값이니 저장해두면 된다. 예시는 다음과 같다.

machine github.com
	login myid1234
	password token_copy_and_paste

 

2. DockerFile 안에 .netrc 포함시키기

일단 만든 .netrc 파일을 DockerFile과 같은 경로로 옮겨두어야 한다. 이게 매우 중요하니 잊지 말고 경로를 옮겨두어야 한다. DockerFile이 이미지 빌드할 때 현 위치를 기준으로 파일들을 찾기 때문에 같은 경로로 옮겨두어야 한다. 

COPY .netrc /root
RUN git clone your_private_repository_link

그리고 위와 같이 git clone 명령어 윗줄에 박아넣어주면 된다. 간단하다. 그리고 이미지 빌드를 하면 문제없이 clone이 돌아가는 것을 확인할 수 있다. 

 

근데 가끔! 이래도 안 될 때가 있다. 사실 안 될 리가 없지만 안된다고 우기는 케이스가 종종 있는데 대부분 개인 private repository가 아닌 다른 private repository를 clone할 때다. 

 

예를 들어, 연구실 private repository를 clone하고 싶을 때, 연구실 일원인 내가 내 계정으로 만든 token을 쓴다고 했을 때다. 

 

이 경우 안되는 이유는 대부분 전혀 다른 원인인데, private repository에 본인이 멤버로 등록이 안되어 있어서다. (바보 같은 이유)

 

private repository - Settings - Collaborators - Manage access 에 들어가보면 본인 이름이 없는 것을 알 수 있다. 멤버 등록이 안되어 있으니 개인 token으로 만든 .netrc 파일을 넣어준다 한들 권한이 없는 것은 여전한 것이다. 

 

private repository 소유자한테 본인 멤버 등록 꼭 해달라고 하자.

 

 

반응형