설명
Dockerfile에 USER가 없으면 기반 이미지의 사용자 설정을 따릅니다. 기반 이미지에도 사용자가 없으면 기본값은 root입니다. 따라서 USER 생략만으로 항상 root라고 단정할 수는 없지만, 최종 이미지의 실제 사용자를 확인해야 합니다.
계정을 생성하는 작업만으로 실행 사용자가 바뀌지는 않습니다. 멀티 스테이지 빌드에서는 최종 단계가 사용하는 기반 이미지와 사용자 설정을 확인하세요.
잠재적 영향
- 실제 사용자가 root라면 애플리케이션 침해가 컨테이너 내부의 더 넓은 파일·프로세스 접근으로 이어질 수 있습니다.
- 기반 이미지나 배포 설정의 변경으로 의도한 실행 권한이 달라질 수 있습니다.
해결 방법
- 최종 실행 단계에 필요한 비루트 계정을 준비하고
USER <non-root-user>로 명시하세요. - 애플리케이션 파일과 쓰기 디렉터리의 소유자·권한을 실행 계정에 맞게 제한하세요.
- 이미지 설정과 런타임 사용자 재정의를 함께 확인하고 애플리케이션의 시작 및 파일 접근을 시험하세요.
예시
예제는 실제 app/app.py와 해당 버전에 맞는 애플리케이션 코드가 필요합니다. 의존성은 검증한 버전으로 관리하고 계속 업데이트하세요.
변경 전
dockerfile
FROM python:3.13-slim
RUN pip install Flask==3.1.2
RUN useradd -ms /bin/bash appuser
COPY --chown=appuser:appuser app /app
WORKDIR /app
CMD ["python", "app.py"]
이 기반 이미지는 기본적으로 root를 사용합니다. appuser를 만들고 파일 소유권을 주어도 실행 계정은 바뀌지 않습니다.
변경 후
dockerfile
FROM python:3.13-slim
RUN pip install Flask==3.1.2
RUN useradd -ms /bin/bash appuser
COPY --chown=appuser:appuser app /app
WORKDIR /app
USER appuser
CMD ["python", "app.py"]
USER appuser로 애플리케이션의 기본 실행 계정을 지정합니다. 이 예제의 파일 소유권도 해당 계정에 맞춰져 있습니다.