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

기초·개념3분조회 –

베이스 이미지 태그를 ubuntu:24.04 로 바꿨더니 빌드가 유저를 만드는 줄에서 멈췄습니다. 보안 점검에서 오래된 베이스 이미지를 최신 LTS 로 올리라는 권고가 나와서, 할 일은 FROM 한 줄 바꾸는 것뿐이었습니다.

멈춘 자리는 Dockerfile 끝쯤에 전용 유저를 만드는 부분입니다. 컨테이너 안의 앱을 root 로 돌리지 않는 건 기본에 가까워서, 유저를 하나 만들고 거기로 내려서 실행합니다.

이때 UID 와 GID 를 1000 으로 박아 두는 관습이 있습니다. 리눅스에서 처음 만들어지는 일반 계정이 보통 1000 이라, 호스트 디렉토리를 볼륨으로 붙였을 때 파일 소유자가 맞아떨어지기 때문입니다.

useradd: UID 1000 is not unique

UID 1000 을 이미 누가 쓰고 있다는 얘기지만, 방금 받은 깨끗한 이미지에서 나온 메시지입니다.

원인 — 24.04의 UID 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 그대로라 볼륨 권한도 안 깨집니다.

trixie 메인 저장소엔 openjdk-17 이 없음

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

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

. /etc/os-release 를 먼저 읽어야 $VERSION_CODENAME 이 채워지고, 이걸 빼면 빈 문자열이 들어가서 apt 소스가 깨집니다.

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

베이스 이미지 메이저 업그레이드는 버전 숫자만 바꾸는 일처럼 보이지만 배포판이 기본 유저를 넣거나 저장소에서 패키지를 빼는 변화가 그 안에 같이 들어옵니다. 24.04 의 UID 1000 도 trixie 의 openjdk-17 이 없는 것도 릴리스 노트를 안 읽으면 빌드가 깨지고 나서야 알게 됩니다.

non-root 유저가 필요할 때는 UID 를 고정해 새로 만드는 대신 배포판이 주는 기본 유저의 이름만 바꿔 쓰면 이 충돌을 아예 안 만나고, UID 도 그대로 유지되니 볼륨 권한을 건드릴 일도 없습니다.

  1. 불러오는 중