실전 자동화 튜토리얼

재부팅마다 Docker 빌드가 깨졌다면 이거부터 확인하세요

정데비 2026. 7. 14. 15:36

인스턴스 재시작 한 번에 빌드가 전부 깨졌다 (Docker 권한 트러블슈팅편)

이전 글: Oracle A1 "자리 없습니다" 에러 극복기 — 링크는 실제 발행 후 URL과 일치하는지 확인해주세요.

증상: Firebase App Distribution 배포가 전부 실패

Oracle A1 인스턴스를 재부팅할 일이 있었다. 재부팅 자체는 문제없이 끝났고, systemd가 러너들도 알아서 잘 띄웠다. 그런데 다음 배포에서 Firebase App Distribution으로 앱을 올리는 워크플로우가 줄줄이 실패하기 시작했다.

에러 로그를 까보니 Docker 관련 권한 에러였다. 러너 컨테이너 안에서 Docker 소켓(/var/run/docker.sock)에 접근하지 못하는 상황이었다.

원인: 재시작 후 docker 그룹 GID가 세션에 반영되지 않음

이 러너들은 컨테이너 내부에서 호스트의 Docker 소켓을 바인드 마운트해서 쓰는 구조다 (Docker-in-Docker 대신 소켓 공유 방식). 컨테이너 안의 러너 유저가 docker 그룹에 속해 있어야 소켓에 접근할 수 있는데, 문제는 이거였다.

  • 컨테이너가 시작될 때 러너 유저를 docker 그룹에 넣는 로직이 있었는데
  • 인스턴스 재시작 후 컨테이너가 재생성되는 과정에서 이 그룹 가입이 제대로 적용되지 않고 셸에 반영이 안 된 상태로 프로세스가 떠버림

즉, 유저는 docker 그룹에 "속해 있지만" 현재 실행 중인 셸/프로세스의 그룹 컨텍스트에는 반영이 안 된 상태였다.

해결: exec sg docker

리눅스에서 그룹 멤버십 변경은 현재 로그인 세션에는 즉시 반영되지 않는다. 새로 로그인하거나, 아니면 sg(switch group) 명령으로 새 그룹 컨텍스트의 셸을 띄워야 한다.

컨테이너 엔트리포인트 스크립트에 핵심 아이디어만 반영하면 다음과 같다.

# entrypoint.sh (핵심 로직만, 전문은 발행 전 직접 붙여넣을 것)

usermod -aG docker "$RUNNER_USER"

# 그룹 변경 사항을 현재 세션에 즉시 반영시켜 실행
exec sg docker -c "/opt/github-runner/run-runner.sh"

usermod -aG docker만 실행하고 바로 이어서 러너 스크립트를 실행하면, 그 프로세스는 여전히 예전 그룹 컨텍스트로 돈다. exec sg docker -c "..."로 감싸줘야 새 그룹이 적용된 상태로 프로세스가 교체된다.

적용 범위: 컨테이너 4개 + 소스 이미지

이 문제는 프로젝트별로 떠 있던 러너 컨테이너 전부에서 동일하게 발생했다.

  • github-runner-appler
  • github-runner-devy-workspace
  • github-runner-alterai
  • github-runner-pixaloom

네 컨테이너에 각각 핫픽스를 적용한 뒤, 근본적으로는 my-github-runner 이미지의 Dockerfile/엔트리포인트 자체를 고쳐서 다음 빌드부터는 이 문제가 재발하지 않도록 했다.

정리 & 교훈

  • Docker 소켓을 바인드 마운트해서 쓰는 컨테이너는 "그룹에 추가"와 "그룹이 적용된 상태로 실행"이 별개라는 걸 항상 염두에 둬야 한다
  • usermod -aG 이후 같은 세션에서 바로 권한을 쓰려면 exec sg <group> -c "..." 또는 재로그인이 필요
  • 이런 종류의 버그는 평소엔 안 보이다가 인스턴스/컨테이너가 재생성되는 시점(재부팅, 재배포)에만 튀어나오는 특징이 있어서 재현이 까다롭다. 이번 기회에 컨테이너 재시작을 정기적으로 한 번씩 테스트해보는 습관을 들이기로 했다.

[핵심요약] Docker 그룹 권한, 재부팅마다 안 먹던 이유

LIST