Docker permission denied 해결 방법 총정리
Docker 실행 시 permission denied 오류의 모든 원인과 해결 방법. /var/run/docker.sock, 볼륨 마운트, 컨테이너 내부 파일 권한 문제까지.
TestForge Team ·
오류 유형 3가지
유형 1: Docker 소켓 접근 권한
permission denied while trying to connect to the Docker daemon socket
at unix:///var/run/docker.sock
유형 2: 컨테이너 내부 파일 실행 권한
exec /app/entrypoint.sh: permission denied
유형 3: 볼륨 마운트 파일 권한
open /data/config.yaml: permission denied
유형 1 해결: Docker 소켓 권한
원인
docker.sock은 기본적으로 root 또는 docker 그룹만 접근 가능합니다.
ls -la /var/run/docker.sock
# srw-rw---- 1 root docker ...
해결 방법 A: 현재 사용자를 docker 그룹에 추가 (권장)
sudo usermod -aG docker $USER
# 적용을 위해 로그아웃 후 재로그인
# 또는 새 셸 시작
newgrp docker
# 확인
docker ps
해결 방법 B: 임시 권한 (비권장)
sudo chmod 666 /var/run/docker.sock
# 보안 주의: 재부팅 시 초기화됨
CI/CD에서 docker.sock 사용 시
# GitHub Actions
- name: Build
run: docker build .
# GitHub Actions runner는 docker 그룹 포함 → 별도 설정 불필요
# Jenkins 컨테이너에서 docker 사용
docker run -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins
# jenkins 사용자를 docker 그룹에 추가
docker exec jenkins usermod -aG docker jenkins
유형 2 해결: 파일 실행 권한
원인
Dockerfile에서 복사한 스크립트에 실행 권한이 없습니다.
# 문제
COPY entrypoint.sh /app/entrypoint.sh
ENTRYPOINT ["/app/entrypoint.sh"] # permission denied!
# 해결
COPY entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh
ENTRYPOINT ["/app/entrypoint.sh"]
Windows에서 작성한 스크립트
Windows에서 만든 .sh 파일은 실행 권한이 없고 CRLF 줄 바꿈 문제도 있습니다.
# Git 속성으로 해결
echo "*.sh text eol=lf" >> .gitattributes
# 또는 Dockerfile에서 dos2unix 실행
RUN apt-get install -y dos2unix && dos2unix /app/entrypoint.sh && chmod +x /app/entrypoint.sh
유형 3 해결: 볼륨 마운트 권한
원인
컨테이너 내부 프로세스가 마운트된 호스트 디렉터리에 쓰기 권한 없음.
# 컨테이너 내부 사용자 확인
docker exec my-container id
# uid=1000(appuser) gid=1000(appuser)
# 호스트 디렉터리 권한 확인
ls -la /host/data/
# drwxr-x--- root root → appuser(1000) 쓰기 불가
해결 방법 A: 호스트 디렉터리 권한 변경
sudo chown -R 1000:1000 /host/data/
# 또는
sudo chmod 777 /host/data/ # 보안 낮음
해결 방법 B: Dockerfile에서 사용자 UID 맞추기
# 호스트의 데이터 디렉터리 소유자 UID와 맞춤
ARG UID=1000
RUN useradd -u $UID -m appuser
USER appuser
해결 방법 C: docker-compose에서 user 지정
services:
app:
image: my-app
user: "1000:1000"
volumes:
- ./data:/app/data
Kubernetes에서의 권한 문제
# securityContext로 UID/GID 지정
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000 # 볼륨 마운트 파일의 그룹을 1000으로 설정
containers:
- name: app
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
빠른 진단 명령어
# 1. 컨테이너 내부 현재 사용자
docker exec my-container id
# 2. 파일/디렉터리 권한 확인
docker exec my-container ls -la /app/
# 3. root로 컨테이너 접속해서 조사
docker exec -it --user root my-container /bin/sh
# 4. 컨테이너 실행 시 root로 오버라이드 (임시 디버깅)
docker run --user root -it my-image /bin/sh