Docker를 다룰 때 아주 흔하게 발생하는 '볼륨 마운트(Volume Mount) 타입 불일치' 에러
Docker 볼륨 마운트 타입 불일치 에러 해결 방법 정리
Docker를 사용하다 보면 정말 자주 마주치는 에러 중 하나가 바로 볼륨 마운트(Volume Mount) 타입 불일치 오류입니다.
특히 Windows + WSL + Docker Desktop 환경에서 많이 발생하는데, 처음 보면 꽤 당황스럽습니다.
대표적인 에러 메시지는 아래와 같습니다.
Are you trying to mount a directory onto a file (or vice-versa)?
즉,
“디렉토리를 파일에 마운트하려고 했거나, 파일을 디렉토리에 마운트하려고 한 것 같은데요?”
라는 의미입니다.
에러가 발생하는 원인
현재 환경은 아마 다음과 비슷할 가능성이 높습니다.
Windows
WSL2
Docker Desktop
docker-compose 사용
그리고 docker-compose.yml 안에는 보통 아래와 같은 설정이 들어 있습니다.
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
이 설정의 의미는 다음과 같습니다.
| 호스트(내 PC) | 컨테이너 내부 |
|---|---|
./init.sql 파일 | /docker-entrypoint-initdb.d/init.sql 파일 |
즉, 파일 → 파일 마운트를 하겠다는 뜻입니다.
그런데 왜 에러가 발생할까?
문제는 Docker가 실행될 때 발생합니다.
만약 호스트 경로에 있는 init.sql 파일이 실제로 존재하지 않거나,
Docker가 해당 경로를 찾지 못하면 Docker는 이렇게 판단합니다.
“아, init.sql이라는 이름의 디렉토리를 마운트하려는 건가 보다!”
그리고 놀랍게도(?) 자동으로 빈 폴더를 하나 생성해버립니다.
즉 결과적으로는 이런 상황이 됩니다.
| 실제 상태 |
|---|
호스트: init.sql → 디렉토리 |
컨테이너: init.sql → 파일 |
그러면 Docker 입장에서는
디렉토리를 파일에 덮어쓰기 하려 하고
타입이 충돌하면서
컨테이너가 실행되지 못하게 됩니다.
그래서 결국 아래 에러가 발생하는 것입니다.
Are you trying to mount a directory onto a file (or vice-versa)?
가장 깔끔한 해결 방법
이 문제를 가장 확실하게 해결하는 방법은:
파일 직접 마운트 방식을 제거하고 Dockerfile의 COPY 방식만 사용하는 것
입니다.
1단계: docker-compose.yml 수정
먼저 docker-compose.yml 파일에서init.sql 마운트 부분을 제거합니다.
기존 설정:
isp_edutube_db:
build:
context: ./database
dockerfile: Dockerfile
volumes:
- ./database/mysql:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
수정 후:
isp_edutube_db:
build:
context: ./database
dockerfile: Dockerfile
volumes:
- ./database/mysql:/var/lib/mysql
# 아래 줄 제거 또는 주석 처리
# - ./init.sql:/docker-entrypoint-initdb.d/init.sql
핵심은 이 줄입니다.
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
이 부분이 충돌의 원인이므로 제거합니다.
2단계: Docker가 만든 가짜 폴더 삭제
이 단계가 정말 중요합니다.
프로젝트 루트 경로를 확인해보세요.
예시:
C:\isp_edutube
아마 그 안에 아래처럼 생긴 폴더가 생성되어 있을 가능성이 높습니다.
init.sql
주의할 점은:
파일이 아니라
“폴더(디렉토리)”라는 점입니다.
Docker가 자동으로 잘못 만들어버린 찌꺼기입니다.
이 폴더는 반드시 삭제해야 합니다.
추가로 기존 MySQL 데이터도 초기화하는 것이 안전합니다.
예시:
database/mysql
안의 데이터도 함께 정리해주면 좋습니다.
3단계: Docker 이미지 다시 빌드
이제 SQL 파일은 Dockerfile에서 직접 복사하도록 설정합니다.
예시 database/Dockerfile
FROM mysql:8.0
COPY init.sql /docker-entrypoint-initdb.d/
이 방식의 장점은 다음과 같습니다.
파일 마운트 충돌 없음
경로 문제 감소
Windows/WSL 환경에서 안정적
배포 환경에서도 동일하게 동작
이제 아래 명령어로 다시 실행합니다.
docker-compose down
docker-compose up --build -d
정리
이번 에러의 핵심 원인은 다음과 같습니다.
파일을 마운트하려 했는데
Docker가 디렉토리로 인식해버린 것
특히 Windows + Docker Desktop 환경에서는
경로 인식 문제 때문에 자주 발생합니다.
그래서 실무에서는 보통:
SQL 초기 파일
설정 파일
초기 데이터
같은 경우에는 볼륨 마운트보다 Dockerfile + COPY 방식을 더 안정적으로 사용합니다.
마무리
Docker를 처음 다루면 이런 에러 하나 때문에 몇 시간을 쓰기도 합니다.
하지만 원리를 이해하면 생각보다 단순한 문제입니다.
핵심은 단 하나입니다.
“파일과 디렉토리 타입이 서로 맞지 않았다.”
앞으로 비슷한 에러가 나오면:
마운트 대상이 파일인지
실제로 존재하는지
Docker가 폴더를 자동 생성하지 않았는지
이 세 가지만 먼저 확인해보면 대부분 빠르게 해결할 수 있습니다.
댓글
댓글 쓰기