2023-05-03 12:05:19
GitLab Runner에서 GitLab private registry의 이미지를 사용하는 과정을 정리하고자 합니다.
이 글에서 깃랩의 버전은 15.11.1
입니다.
컨테이너를 빌드하고 배포하는데는 Docker가 필요합니다. 이때 스크립트를 실행하는 환경에 따라 추가 설정이 필요할 수 있습니다.
GitLab Runner를 shell
환경에서 구동하는 경우 별 다른 설정이 필요없으나, docker
컨테이너 내부에서 구동하고자 할 경우 추가적인 설정이 필요합니다.
도커를 실행해야할 러너를 등록합니다.
이 후 등록이 끝났다면 GitLab Runner의 설정파일(config.toml
)을 엽니다. 해당 파일은 구동 중인 러너의 위치 혹은 구동 중인 계정의 홈 폴더 하위에 존재합니다.
등록한 러너의 설정을 찾아 volumes
라는 항목을 찾습니다.
해당 영역이 러너에서 도커 컨테이너를 올릴 시 마운트할 볼륨의 경로입니다. 추가 마운트 항목에 /var/run/docker.sock:/var/run/docker.sock
를 추가합니다. 예시로 아래와 같이 설정하였습니다.
volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
이렇게 하면 도커 컨테이너 내부에서 외부 도커 소켓을 사용하여 접근할 수 있습니다.
비공개 개인 사설 컨테이너 저장소에 접근하기 위해서는 해당 저장소에 대한 주소, 아이디, 비밀번호를 알고 있어야 합니다. 이 글의 경우에는 GitLab의 개인 사설 컨테이너 저장소를 사용하므로 배포 과정에서 사전 정의된 변수들을 활용하여 별다른 설정 없이 해당 깃 저장소의 컨테이너 저장소에 접근할 수 있습니다.
러너를 구동하기 위해서 .gitlab-ci.yml
파일을 작성합니다.
stages:
- release
Release docker image:
stage: release
image: docker:20.10.16
rules:
- if: $CI_COMMIT_TAG
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
script:
- docker pull $CI_REGISTRY_IMAGE:latest || true
- docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG .
- docker push $CI_REGISTRY_IMAGE:latest
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
tags:
- 설정한_러너_태그
여기서 이미지는 docker:20.10.16
을 사용하였습니다.
before_script
영역에는 도커 로그인을 해놓습니다. 여기서 GitLab에서 사전정의된 변수를 활용하여 추가 설정 없이 아이디($CI_REGISTRY_USER
), 비밀번호($CI_REGISTRY_PASSWORD
), 레지스트리 주소($CI_REGISTRY
)를 가져올 수 있습니다.
이후 script
영역입니다.
docker pull $CI_REGISTRY_IMAGE:latest || true
최신 컨테이너 이미지를 받습니다. 이미 존재하는 레이어에 관해서는 추가적인 빌드를 하지 않을 수 있기 때문에 유용합니다. 해당 스크립트는 실패할 수도 있지만 진행에 문제가 없으므로 stderr가 발생하지 않도록 || true
를 추가해줍니다.
docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG .
도커 빌드를 진행합니다.
--cache-from $CI_REGISTRY_IMAGE:latest
매개변수를 이용하여 이전 명령어에서 받은 최신 빌드를 캐시로 사용합니다.
--tag
매개변수는 각 이미지에 붙을 태그명입니다. 이 글에서는 최신 버전인 :latest
태그와 깃에서 지정한 tag를 활용한 :1.0.0
같은 버전으로 된 태그를 생성하도록 하고 있습니다.
마지막으로 .
부분은 Dockerfile이 위치할 경로를 지정합니다.
docker push $CI_REGISTRY_IMAGE:latest
docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
이후 각 이미지를 배포합니다.
작성을 마친 뒤에는 파이프라인을 동작시켜봅니다.
파이프라인이 성공하면 GitLab에 들어가서 배포가 되었는지 확인합니다.
배포한 컨테이너를 pull 받기 위해서 로그인이 필요합니다.
이때 GitLab의 아이디와 비밀번호를 사용할 수도 있지만 토큰을 발급하여 사용할 수도 있습니다.
사용자 단위 토큰은 해당 사용자의 권한으로 접근 가능한 저장소를 모두 활용할 수 있습니다.
개인적으로 테스트를 하거나 할 경우 발급해서 로컬에 등록하시면 편하게 사용할 수 있습니다.
우측 상단 유저 프로필 > Preferences
> Access Tokens
read_registry
권한을 허가한 후 생성합니다.
이후 생성된 키를 복사한 후 활용합니다.
프로젝트 단위 토큰은 해당 프로젝트의 레지스트리만 접근할 수 있습니다. 특정 배포 스크립트나 특정 환경에서 해당 레지스트리만 사용할 경우 보안 측면에서 사용하기 좋습니다.
프로젝트 좌측 메뉴에서 Settings
> Access Tokens
메뉴에서 생성합니다.
read_registry
권한을 체크한 후 발급하여 사용합니다.
명령어를 친절하게 깃랩에서 복사할 수 있도록 마련되어있다.
우측 상단의 CLI Commands
버튼을 클릭한 뒤 Login 스크립트를 복사합니다.
docker login 깃랩주소
위와 같이 나오는데. 사용할 곳에서 명령어를 입력하면 대화식으로 로그인 정보를 입력할 수 있습니다.
혹은, 아래 처럼 인수로 넘길 수도 있습니다.
docker login 깃랩주소 -u 아이디 -p 비밀번호
하지만, 위 처럼 할 경우 히스토리에 남으므로 보안상 지워주는 것이 좋습니다.
로그인이 성공하면 다음과 같이 출력합니다.
WARNING! Your password will be stored unencrypted in /홈_경로/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
암호화 되지 않은 비밀번호가 저장되어 있으니 주의하라고 합니다.
실제로 아이디와 비밀번호를 단순히 base64 인코딩하여 저장합니다.
credential helper를 사용하여 보안성을 높일 수 있으니 필요하면 참고합니다.
이후 docker pull을 받으시면 정상적으로 사용됩니다.