본문 바로가기
개발환경, 인프라/Docker

[CI/CD] 깃랩 러너 볼륨 할당 문제

by Pendine 2026. 4. 7.
728x90
반응형

깃랩 러너를 대화형으로 사용하면 볼륨을 할당하지 못함.

 

초기 환경구성

미니PC ↔ 개발PC 

미니 PC : 깃랩구동 , 운영프로그램, 배포전 환경 테스트용 개발 CI/CD 및 프로그램 구동, nginx) 

개발PC : 프론트, 백엔드 IDE 구동 및 개발

 

사건의 발단.

1. 개발환경은 미니 PC에 깃랩, 돌려야하는 백, 프론트, DB ,nginx를 전부 몽땅올림.
개발용과 배포용으로 두개씩올림.

2. 레디스 도입 -> 미니 PC 터짐. (깃랩 멈춤, 응답없음, 핑응답 무시, ssh 접속 불가)

3. 한참뒤에 다시 원상복구.

 

문제의 시작

1. 운영이나 개발환경을 노트북으로 옮기자.

2. 그동안 미니pc안에서 전부 사용하던 내용보다는 게이트웨이 형식으로 미니PC에다 nginx를 써보자!
가 오늘 하루를 날린 이유가 됨.

 

도커는 조금 써봤다고 이제 좀 알것같았는데,

깃랩 러너라는놈이 추가되면서, 러너가 언제 어디서 어떻게 돌아가는지 몰랐음.

 

이전의 대책

미니PC에다가 인증서 발급해놨는데 CI/CD로 러너를 통해서 만든 nginx에서 인증서 파일이 계속 형태가 폴더로 나옴.
아 인식을 못하나보다! 이걸 변수로넘겨볼까? 오! 이걸 파일로 넘겨서 보내니까 돼네!
와... 러너방식이 dind라고? 격리가 되서 그런거라고? 와! 대박! 격리까지 생각하는 보안 수준 대단해!!

(아 좀 귀찮게 됐네; 필요한 파일들을 전부 깃랩 ci 변수에 해야한다고? ㄷㄷ;;; 보통일이 아닐텐데)

 

오늘 해결. 해결 과정의 순서

러너를 만들때, 그동안 러너를 만들기만 했지, 러너에게 볼륨을 할당해주지 않아 생겼던 문제라고 판단함.

이제 러너 컨테이너 생성시 볼륨을 할당했음.

1. 볼륨 할당 -> 러너가 인식을 못함. 왜?

2. 도커의 엔진은 도커소켓이란걸 통해서 동작함.

 자식 (깃랩 러너) 이  부모(호스트PC의 도커) 의 소켓을 쓸 수 있도록 이것도 볼륨을 할당해줘야함.

3. 인식함. 

와! 이제 nginx에서 필요한 파일을 받았겠지? -> CI/CD 실패.

4. 뭐지 진짜? 무슨일인거지?

도커러너가 이제 부모한테서 필요한 파일을 받았으니까 (파일/소켓 볼륨 할당받음)

도커 러너는 이제 자신이 만드는 컨테이너가 필요로 하는 파일을 전달 할 수 있겠다고 생각했는데 왤까?

5. 러너의 config.toml 파일 확인. volume에 부모의 소켓, 볼륨이 빠져있음.

6. 러너를 만들때 할당해준 볼륨과, 러너가 할당할 수 있는 볼륨이 다르다는 것임.

러너를 실행할때 대화형을 입력방식으로 필요한 파일 값들을 입력했었는데,

그렇게 진행하면 내가 최종적으로 만들어야 할 컨테이너는 내가 원하는 볼륨이나 파일을 가질 수 없게 됨.

(기본 설정. dind는 완전 격리를 기본으로 전제로함.)

 

진행방법

예시로 내가 사용했던 깃랩 러너의 생성 스크립트를 이용함.

nginx의 게이트웨이 설정값, 인증서등을 넣어놓은 폴더를 /srv

`/var/run/docker.sock`는 호스트의 도커 소켓임. 이것을 할당 받아야 러너가 호스트pc에 접근할 수 있는 키를 갖는것.

 

순서 1. 깃랩 러너 컨테이너 생성 스크립트

docker run -d --name gitlab-runner --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /srv/gitlab-runner/work:/home/gitlab-runner/work \
  -v /srv/nginx/:/etc/nginx \
  -v /srv/nginx/certs:/etc/nginx/certs:ro \
  gitlab/gitlab-runner:latest

 

 

순서 2. 러너 비대화형 실행 스크립트

docker exec -it gitlab-runner gitlab-runner register \
  --non-interactive \
  --url "http://172.30.1.65:4080(깃랩주소)" \
  --registration-token "glrt-GmgShbqut1KNpnffMnXEnHQ6MQp1OjIH.01.0w0im748c(러너토큰)" \
  --executor "docker" \
  --docker-image "docker:latest" \
  (부모(깃랩러너)소켓을 자식(러너가 생성한 컨테이너)가 쓸 수 있게 할당)
  --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
  --docker-volumes "/srv/nginx/certs:/etc/nginx/certs:ro(nginx 설정파일 디렉토리 볼륨 할당)" \
  --docker-volumes "/cache(기본값)"

위의 스크립트를 사용하여 비 대화형으로 실제로 만들어야할 컨테이너에게 전달해야하는 볼륨을 할당해야 사용 가능함.

각각 사용해야하는 볼륨이 많아질수록 --docker-volumes의 갯수가 늘어날테고,

도커 데몬은 시스템 권한이 root고, 입력한 디렉토리가 파일이건 폴더건 접근할 수있고, 없다면 생성, 있다면 가져올 수 있음.

그래서 사용해야하는 파일들이 많다면 호스트에는 /srv와 같은 폴더를 만들어 세분화 해놓고,

사용해야하는 컨테이너들을 /srv를 통채로 받아서 각각 필요한 파일들을 불러쓰도록 하는 것이 더 나은 방법일 것 같음.

이렇게 되면 사용하지 않지만 중복되는 파일들이 많아져서 용량이 많아지지만, 그나마 나은 방법인듯.

더 나은 방법을 모르겠으나.

 

여하튼 최종적으로 러너를 통해서 만들어진 컨테이너가 호스트 PC에 접근 가능하도록 하는 더 나은 방법은 잘 모르겠음

이게 최선임....

 

오늘 아침에 깔짝하고 이력서로 쓸 홈페이지 배포하고 이력서 날리려고 했는데 쉽지 않네.

오늘 하루를 다 써버릴줄은 꿈에도 몰랐음.

항상 늘 그랬지만 금방 끝날줄 알았던 일은 최소 시간단위로 쓰고,

한참 걸릴거라 생각했던 일은 의외로 금방 끝나더라.

728x90
반응형

댓글