매번 컨테이너 생성 할 때마다 호스트(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 를 전달해줘도 됨.
💡 핵심 개념
- EC2에서 실행하는 명령어는 기본적으로 ec2-user 권한을 가짐.
- 컨테이너 내부의 jovyan과 ec2-user는 UID가 같아도 권한은 다름.
- root가 소유한 디렉토리는 jovyan이 직접 변경할 수 없음 → root로 변경 후 chown 실행 필요.
- Dockerfile에서 미리 chown을 실행하면 실행할 때마다 권한 문제를 해결할 필요 없음.
'개발' 카테고리의 다른 글
Docker 컨테이너에서 볼륨 마운트 파일 권한 문제와 해결 방법 (0) | 2024.12.10 |
---|---|
[SPARK] SPARK에서 대량의 스몰 파일이 생성되는 문제 해결 (0) | 2023.06.18 |
네이버 카페 정보 가져오기 (0) | 2021.05.09 |