Permission Denied 오류 해결
이제 permission denied 오류의 원인을 이해했으므로 이를 해결하기 위한 몇 가지 방법을 살펴보겠습니다.
방법 1: 호스트에서 파일 권한 수정
가장 간단한 방법은 호스트의 파일 권한을 변경하여 다른 사용자가 액세스할 수 있도록 허용하는 것입니다.
chmod 755 ~/project/docker-test/testfile.txt
이렇게 하면 권한이 755 (-rwxr-xr-x) 로 변경되어 모든 사용자가 파일을 읽고 실행할 수 있지만 소유자만 수정할 수 있습니다.
컨테이너에서 다시 파일에 접근해 보겠습니다.
docker run --rm -v ~/project/docker-test:/app ubuntu cat /app/testfile.txt
이제 파일의 내용을 볼 수 있습니다.
This is a test file.
이것은 파일이 이제 컨테이너의 사용자를 포함하여 호스트 시스템의 "others"에 의해 읽을 수 있기 때문에 작동합니다.
방법 2: --user 플래그 사용
또 다른 방법은 Docker 에 호스트 사용자와 동일한 사용자 ID 로 컨테이너를 실행하도록 지시하는 것입니다.
## Reset the file permissions to be restrictive
chmod 700 ~/project/docker-test/testfile.txt
## Get your user ID and group ID
USER_ID=$(id -u)
GROUP_ID=$(id -g)
## Run the container with your user ID
docker run --rm --user $USER_ID:$GROUP_ID -v ~/project/docker-test:/app ubuntu cat /app/testfile.txt
이제 제한적인 권한에도 불구하고 파일 내용을 읽을 수 있습니다.
This is a test file.
이것은 다음 이유로 작동합니다.
- 호스트 사용자와 동일한 사용자 ID 로 컨테이너를 실행합니다.
- 파일의 권한은 해당 사용자 ID 에 대한 액세스를 허용합니다.
- Docker 는 사용자 ID 를 컨테이너의 프로세스로 전달합니다.
--user 플래그는 호스트 파일에 제한적인 권한을 유지해야 할 때 특히 유용합니다.
방법 3: 소유자 및 그룹 ID 조정
이 방법을 설명하기 위해 다른 사용자가 소유한 새 파일을 만들어 보겠습니다.
## Create a file as root
sudo bash -c 'echo "This is a root-owned file." > ~/project/docker-test/rootfile.txt'
sudo chown root:root ~/project/docker-test/rootfile.txt
sudo chmod 600 ~/project/docker-test/rootfile.txt
## Let's see what we have
ls -la ~/project/docker-test/
출력은 다음과 같아야 합니다.
total 16
drwxr-xr-x 2 labex labex 4096 XXX XX XX:XX .
drwxr-xr-x X labex labex 4096 XXX XX XX:XX ..
-rw------- 1 root root 25 XXX XX XX:XX rootfile.txt
-rwx------ 1 labex labex 19 XXX XX XX:XX testfile.txt
이제 root 로 실행되는 컨테이너에서 root 소유 파일에 접근해 보십시오.
docker run --rm -v ~/project/docker-test:/app ubuntu cat /app/rootfile.txt
내용을 볼 수 있습니다.
This is a root-owned file.
이것은 다음 이유로 작동합니다.
- 컨테이너는 기본적으로 root (UID 0) 로 실행됩니다.
- 파일은 호스트에서 root (UID 0) 가 소유합니다.
- 권한 (600) 은 소유자가 파일을 읽을 수 있도록 허용합니다.
이것은 이름뿐만 아니라 실제 사용자 ID 가 중요하다는 것을 보여줍니다. 컨테이너의 사용자 ID 가 파일의 소유자 ID 와 일치하면 소유자에게 필요한 권한이 있는 경우 권한 검사가 성공합니다.