회사 프로젝트의 Dockerfile 작업 중 RUN chown -R $USERNAME:$USERNAME /usr/app/logs 명령이 실행되었음에도 불구하고, 컨테이너 내부에서 해당 디렉토리의 소유권이 바뀌지 않는 이상한 현상을 겪었다. 겉보기엔 명령어에 문제가 없어 보였지만 실제로는 여러 요인이 복합적으로 작용하고 있었다. 아래는 이 문제를 해결해 나간 실제 과정을 단계별로 정리한 기록이다.
$USERNAME 변수 인식 여부 확인
가장 먼저 의심한 건 $USERNAME 변수였다. Dockerfile에서 $USERNAME이 제대로 지정되지 않았거나 ARG 또는 ENV로 설정되지 않았다면, 해당 명령은 무시되거나 root:root로 적용될 수 있다.
# 더 안전한 방식
RUN chown -R myuser:myuser /usr/app/logs
디렉토리 존재 여부 확인
다음으로는 /usr/app/logs 디렉토리가 명령 실행 시점에 존재하는지 확인이 필요했다. 디렉토리가 존재하지 않으면 chown은 아무 작업도 하지 않는다.
RUN mkdir -p /usr/app/logs && chown -R myuser:myuser /usr/app/logs
assembly.xml의 fileset이 권한 덮어쓰기 원인으로 의심
내가 사용 중이던 Maven 프로젝트에는 assembly.xml 파일이 있었고, 다음과 같이 logs 디렉토리를 지정하고 있었다.
<fileset>
<directory>${project.build.directory}/some-path</directory>
<outputDirectory>logs</outputDirectory>
</fileset>
이 설정은 패키징된 결과물 안에 logs 디렉토리를 포함시켰고, 이후 Dockerfile에서 이 아카이브를 COPY하거나 ADD하면서 기존에 설정한 권한이 다시 덮어씌워졌다.
압축 해제 이후 권한 덮어쓰기 확인 및 대응
압축파일을 Dockerfile에서 해제한 후 권한이 다시 root로 설정되는 현상이 실제로 확인되었다. 이 문제를 해결하기 위해선 다음과 같은 방법을 사용할 수 있다.
RUN tar -xzf app.tar.gz -C /usr/app && chown -R myuser:myuser /usr/app
또는 COPY 시점에 --chown 옵션을 붙여 아예 파일 복사와 동시에 권한을 지정하는 것이 더 깔끔하다.
COPY --chown=myuser:myuser dist/ /usr/app/
VOLUME 선언으로 인한 무효화 가능성
VOLUME /usr/app/logs 같은 설정이 Dockerfile에 있을 경우, 해당 디렉토리는 컨테이너가 실행될 때 호스트의 볼륨으로 마운트된다. 이 경우 Dockerfile 빌드 단계에서의 chown 명령은 아무 효과도 없이 무시될 수 있다.
이 경우엔 VOLUME 설정을 제거하거나, 실제로 볼륨 마운트가 필요한 경우엔 호스트에서 직접 권한을 조정해야 한다.
USER 전환 시점에서 권한 변경 실패
USER myuser로 전환한 이후에 RUN chown ...을 실행하는 경우, 해당 유저에게 권한이 없어서 명령이 실패할 수 있다. 이를 해결하기 위해선 일시적으로 root로 전환하여 권한을 설정하고 다시 원래 유저로 되돌리는 방식이 필요하다.
USER root
RUN chown -R myuser:myuser /usr/app/logs
USER myuser
디버깅을 위한 권한 출력 추가
Dockerfile에서 명령이 실제로 적용되었는지 확인하기 위해 ls -l 명령을 추가해 로그로 확인하는 것이 유용했다.
RUN chown -R myuser:myuser /usr/app/logs && ls -l /usr/app
이렇게 하면 빌드 로그를 통해 디렉토리 소유권이 원하는 대로 설정되었는지 바로 확인할 수 있다.
마무리하며
이번 문제는 단순히 RUN chown 명령이 적용되지 않는 현상처럼 보였지만, 그 원인은 빌드 도구의 압축 처리 방식, Dockerfile의 레이어 순서, 유저 전환, 볼륨 마운트 등 복합적인 요소에 있었다. 하나씩 원인을 좁혀가며 해결한 경험을 통해 Docker 이미지 빌드 흐름에 대해 더 깊이 이해하게 되었고, 앞으로는 이런 문제를 더 빠르게 파악하고 대응할 수 있을 것 같다.
'개발 (Development) > Docker' 카테고리의 다른 글
| [Docker] Docker 환경에서 yarn 설치 시 인증서 오류 해결 (0) | 2025.06.01 |
|---|---|
| [Docker] on-premise 환경에서 Docker Compose의 Build 문제 해결 (0) | 2025.06.01 |
| [Docker] Alpine 이미지 SSL 인증 오류 해결 (certificate verify failed) (0) | 2025.06.01 |
| [Docker] Docker 컨테이너 생성과 삭제 이력 추적하는 방법 (0) | 2025.04.26 |
| [Docker] Docker 로그 필터링 - grep 사용 시 문제와 해결 팁 (0) | 2024.12.30 |