Ubuntu 24.04 베이스 이미지 — UID 1000 충돌

기초·개념2분조회

보안 점검 권고로 오래된 컨테이너 베이스 이미지를 최신 LTS 인 Ubuntu 24.04 로 올리는 작업이었습니다.

베이스 이미지를 ubuntu:24.04 로 올렸더니 빌드가 유저 생성 단계에서 깨졌습니다. 바꾼 건 베이스 이미지 태그 하나뿐이었습니다.

원인 — 24.04의 UID 1000 기본 유저

앱을 non-root 로 돌리려고 관습적으로 이렇게 UID/GID 1000 유저를 만들어 왔습니다.

RUN groupadd -g 1000 app && useradd -u 1000 -g 1000 app

ubuntu:24.04 부터는 이미지에 ubuntu 라는 기본 유저가 이미 들어 있고, 그게 UID/GID 1000 을 차지합니다. 그래서 1000 으로 새 유저를 만들려 하면 충돌로 실패합니다. 22.04 까지는 1000 이 비어 있어서 이 패턴이 잘 됐는데, 24.04 에서 바뀐 겁니다.

해결 — 기존 유저 개명

1000 을 그대로 쓰고 싶으면, 유저를 새로 만들지 말고 이미 있는 ubuntu 유저의 이름을 바꾸면 됩니다.

RUN groupmod -n app ubuntu && \
    usermod -l app -d /home/app -m -s /bin/bash ubuntu

groupmod -n 으로 그룹명을, usermod -l 로 유저명을 바꾸고 홈 디렉토리까지 옮깁니다. UID/GID 는 1000 그대로라 볼륨 권한 같은 것도 안 깨집니다.

Debian trixie의 openjdk-17 부재

같은 보안 점검에서 JDK 이미지도 손봤는데, Debian trixie 메인 저장소엔 openjdk-17 패키지가 없었습니다(21, 25 만 있음). 17 을 유지하려면 Adoptium Temurin apt 저장소를 코드네임 기준으로 추가해야 했습니다.

RUN echo "deb https://packages.adoptium.net/artifactory/deb $VERSION_CODENAME main" \
    > /etc/apt/sources.list.d/adoptium.list

베이스 이미지 업그레이드가 빌드를 깨는 지점

베이스 이미지 메이저 업그레이드는 “버전 숫자만 바꾸는” 일이 아닙니다. 배포판이 기본 유저를 넣거나(24.04 의 UID 1000), 저장소에서 패키지를 빼는(trixie 의 openjdk-17) 변화가 조용히 빌드를 깹니다. non-root 유저는 UID 를 고정으로 새로 만드는 대신, 배포판이 주는 기본 유저를 개명해 쓰는 쪽이 이런 충돌을 피합니다.

  1. 불러오는 중