개발

Docker 컨테이너에서 볼륨 마운트 파일 권한 문제와 해결 방법

wonpick 2024. 12. 10. 13:18

Docker를 사용하다 보면, 컨테이너 내부에서 볼륨 마운트된 파일에 접근하려고 할 때 권한 문제가 발생하는 경우가 있습니다. 특히, 기본적으로 설정된 컨테이너 사용자의 UID와 호스트 파일의 소유자가 다를 때 이런 문제가 두드러집니다. 이번 글에서는 이 문제의 원인과 해결 방법을 정리해 보겠습니다.

 


1. 문제 상황

Docker 컨테이너에서 Jupyter 기반의 PySpark 환경(jupyter/pyspark-notebook)을 설정한 후, 호스트 디렉터리를 컨테이너와 공유하기 위해 다음과 같이 볼륨 마운트를 설정했습니다.

docker run -d --name dwspark \
  -v /home/dawon/projects/spark_notebook/sparkdata:/home/jovyan/sparkdata \
  -v /home/dawon/projects/spark_notebook/work:/home/jovyan/work \
  -p host port:8888 \
  -p host port:4040 \
  dwspark:0.1

컨테이너 내부에서는 /home/jovyan 사용자가 파일을 관리하도록 되어 있지만, 볼륨 마운트된 디렉터리의 파일은 호스트 파일 시스템의 소유권과 권한을 그대로 유지합니다. 이로 인해 다음과 같은 문제가 발생했습니다.

  • 컨테이너 내부에서 jovyan 사용자가 볼륨 마운트된 파일을 수정하려고 할 때 "Permission denied" 오류 발생.
  • 호스트 파일의 소유자가 UID 2011로 설정되어 있었지만, 컨테이너 내부의 jovyan 사용자는 기본적으로 UID 1000이었음.
  • UID 불일치로 인해 컨테이너 내부에서 파일에 대한 접근 권한이 제한됨.

 

2. 원인 분석

(1) 볼륨 마운트의 특성

Docker의 볼륨 마운트는 호스트 파일 시스템과 컨테이너 파일 시스템을 연결합니다. 하지만 이 과정에서 파일 소유자 및 권한 정보는 호스트 파일 시스템의 설정을 따릅니다.
따라서, 컨테이너 내부에서 특정 파일의 소유자 정보를 확인해 보면 다음과 같은 상황이 발생합니다.

  • 호스트 파일의 소유자가 UID 2011이라면, 컨테이너 내부에서도 UID 2011로 표시됨.
  • 컨테이너 사용자가 UID 1000이라면, 이 사용자는 해당 파일의 소유자가 아니므로 읽기/쓰기 권한이 제한됨.

(2) UID 불일치

컨테이너 내부의 기본 사용자 jovyan은 UID 1000을 사용합니다. 하지만 호스트 파일의 소유자는 UID 2011로 설정되어 있었기 때문에, 컨테이너 내부에서는 파일 소유권이 맞지 않아 권한 문제가 발생했습니다.

 


 

3. 해결 방법

이 문제를 해결하기 위해 컨테이너 내부와 호스트 간의 UID를 일치시키거나, 파일 권한을 조정하는 방법이 필요합니다. 아래는 이를 해결하는 세 가지 방법입니다.

 

 

(1)  컨테이너 사용자의 UID를 호스트와 맞추기

Dockerfile을 수정하여 컨테이너 내부의 jovyan 사용자의 UID를 호스트와 동일하게 설정합니다.
아래는 이를 구현한 Dockerfile 예제입니다.

FROM jupyter/pyspark-notebook:spark-3.3.0

USER root
# 컨테이너 내부 jovyan 사용자의 UID를 2011로 변경
RUN usermod -u 2011 jovyan
# 변경된 UID에 맞게 홈 디렉터리 소유권 수정
RUN chown -R 2011 /home/jovyan
USER jovyan

이 Dockerfile을 기반으로 이미지를 빌드한 후 실행하면, 컨테이너 내부의 jovyan 사용자가 호스트 파일의 소유자 UID와 일치하게 되어 권한 문제가 해결됩니다.

 

(2) 호스트 파일의 소유권 변경

호스트 파일의 UID를 컨테이너 내부 사용자와 동일하게 변경할 수도 있습니다. 이 방법은 다음 명령어를 사용해 구현합니다.

sudo chown -R 1000:1000 /home/dawon/projects/spark_notebook/sparkdata
sudo chown -R 1000:1000 /home/dawon/projects/spark_notebook/work

이 명령어는 호스트 파일 소유자를 UID 1000으로 변경하여, 컨테이너 내부의 기본 사용자 jovyan과 일치시킵니다. 그러나 이 방법은 호스트의 다른 사용자가 파일에 접근할 경우 문제를 일으킬 수 있으므로 주의가 필요합니다.

 

(3) 파일 권한 완화

테스트 환경에서만 사용할 수 있는 간단한 방법으로, 호스트 파일의 권한을 모든 사용자에게 열어주는 것입니다.

chmod -R 777 /home/dawon/projects/spark_notebook/sparkdata
chmod -R 777 /home/dawon/projects/spark_notebook/work

이렇게 하면 권한 문제는 해결되지만, 보안상 취약점이 있으므로 프로덕션 환경에서는 권장되지 않습니다.

 


 

4. 정리 및 결론

컨테이너에서 볼륨 마운트를 사용할 때 권한 문제를 해결하려면, 호스트와 컨테이너 간의 UID를 일치시키는 것이 가장 안전하고 권장되는 방법입니다. Docker 컨테이너에서 볼륨 마운트를 효과적으로 사용하려면, UID와 권한 설정을 정확히 이해하고 관리해야 합니다. 이 글이 비슷한 문제를 겪는 분들에게 도움이 되길 바랍니다!