wonpick
devvon
wonpick
방문자🌱
오늘
어제
  • 분류 전체보기 (146)
    • 개발 (42)
      • Spark (7)
      • Hadoop (3)
      • ML&DL (4)
      • Paper Review (0)
      • ETC (24)
    • STUDY (77)
      • Data Engineering (54)
      • Cloud (4)
      • Algorithm (5)
      • SQL (10)
      • Toy Project (1)
    • Android (2)
    • Backend (14)
    • 인턴 (0)
    • 공모전 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • 인턴강연
  • 쿠버네티스
  • kodekloud
  • 데이터엔지니어링
  • 최신 데이터 인프라 이해하기 #7
  • 자연어처리
  • 최신 데이터 인프라 이해하기
  • SQL
  • cka
  • Python

최근 댓글

최근 글

티스토리

Designed By.hELLO
wonpick

devvon

Docker Jupyter 컨테이너에서 볼륨 마운트 시 권한 문제 발생 및 해결
개발

Docker Jupyter 컨테이너에서 볼륨 마운트 시 권한 문제 발생 및 해결

2025. 2. 27. 18:24

매번 컨테이너 생성 할 때마다 호스트(ec2-user)와 컨테이너 내부(jovyan)의 권한이 일치하지 않아

에러가 발생해 해결과정을 기록해본다.

 

구체적으로는 EC2에서 SSH로 접속한 ec2-user가

컨테이너 내부의 /home/jovyan/work 디렉토리 (호스트 디렉토리로 볼륨마운트) 에 대한 변경 권한이 없었기 때문에

발생한 문제로 어떻게 해결했는지 기록합니다. 


1. 문제의 핵심 정리

  • EC2에서 SSH 접속 시, 기본적으로 호스트의 ec2-user(UID=1000, GID=1000)로 로그인.
  • Docker 컨테이너 내부의 jovyan은 UID=1000, GID=100(users).
  • /home/jovyan/work 디렉토리의 소유자가 root 로 되어 있어서 jovyan도 변경할 수 없는 상태였음.
  • chown -R 1000 /home/jovyan을 실행했지만, work 디렉토리는 root가 소유하고 있어서 permission denied 오류 발생.
    • 즉, 컨테이너 내부에서 파일을 수정하려면 jovyan 권한이 필요하지만, work/의 소유자가 root라서 jovyan이 변경할 수 없었다.  

 

 


2. 왜 EC2에서 접속했을 때 문제가 발생했을까?

일반적으로 SSH로 EC2에 접속하면 호스트(ec2-user)에서 실행되는 작업이 컨테이너 내부의 jovyan과 같은 권한을 가질 수 없음.

(1) EC2에서 실행한 명령어의 권한 문제

컨테이너를 이미 실행했다면 ec2의 uid가 어떻게 되어있는지 확인을 먼저 하고 소유자를 변경하면 된다. 

#확인
cat /etc/passwd #하게되면 ec2-user에 대한 uid 확인
#ec2-user:x:1000:1000:EC2
  • EC2에서 실행한 명령어는 ec2-user 권한을 가짐.
  • 하지만, 컨테이너 내부에서는 jovyan 권한을 사용하므로, root가 소유한 파일을 변경할 수 없음.
  • 그래서 permission denied 오류가 발생함.

즉, EC2에서 실행하는 것 자체가 외부 사용자(ec2-user)가 컨테이너 내부 사용자(jovyan)의 파일을 수정하려고 시도한 것과 같음.


3. 해결 방법과 원리

✅ 해결 방법

0.docker run 실행 시 --user 추가 

docker run -it --user 1000:100 -v /home/ec2-user/spark/work:/home/jovyan/work spark-3.5.3

 

1.컨테이너 내부에서 root 권한을 사용해 소유권을 변경

docker exec -it --user root <컨테이너 ID> bash
chown -R 1000 /home/jovyan
exit
  • --user root 옵션을 사용하여 컨테이너 내부에서 root 권한을 얻음.
  • root는 모든 파일을 변경할 수 있으므로, /home/jovyan/work의 소유권을 변경할 수 있음.
  • 이미 실행 중인 컨테이너 내부에서 파일 소유권 변경

2. Dockerfile에서 미리 chown을 실행하여 컨테이너 생성 시 권한을 맞춤

#RUN groupmod -g  users #그룹은 따로 설정 안함
USER root
RUN usermod -u 1000 jovyan
RUN chown -R 1000 /home/jovyan
USER jovyan
  • 이렇게 하면 컨테이너가 처음 실행될 때부터 권한이 정상적으로 설정됨.
  • 다만 빌드 시점에 chown이 실행되므로 볼륨 마운트는 컨테이너 실행 시점에 적용되기 때문에 컨테이너가 실행되면서 다시 호스트 디렉토리가 덮어씌워지면서 root로 보일 수 있음

4. 결론

🔍 최종 원인

  • EC2에서 SSH로 접속한 ec2-user가 컨테이너 내부의 /home/jovyan/work 디렉토리를 수정하려 했지만,
    해당 디렉토리는 root가 소유하고 있어서 jovyan도 수정할 수 없었음.
  • 결국, 컨테이너 내부에서 root 권한을 사용해 소유권을 변경해야 했음.
  • 혹은 docker run 할때 --user 에다가 uid 를 전달해줘도 됨.

root -> jovyan 변경되는걸 보면 됨. uid 변경

💡 핵심 개념

  1. EC2에서 실행하는 명령어는 기본적으로 ec2-user 권한을 가짐.
  2. 컨테이너 내부의 jovyan과 ec2-user는 UID가 같아도 권한은 다름.
  3. root가 소유한 디렉토리는 jovyan이 직접 변경할 수 없음 → root로 변경 후 chown 실행 필요.
  4. Dockerfile에서 미리 chown을 실행하면 실행할 때마다 권한 문제를 해결할 필요 없음.

'개발' 카테고리의 다른 글

Docker 컨테이너에서 볼륨 마운트 파일 권한 문제와 해결 방법  (0) 2024.12.10
[SPARK] SPARK에서 대량의 스몰 파일이 생성되는 문제 해결  (0) 2023.06.18
네이버 카페 정보 가져오기  (0) 2021.05.09
    wonpick
    wonpick

    티스토리툴바