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를 처음 다루면 이런 에러 하나 때문에 몇 시간을 쓰기도 합니다.
하지만 원리를 이해하면 생각보다 단순한 문제입니다.

핵심은 단 하나입니다.

“파일과 디렉토리 타입이 서로 맞지 않았다.”

앞으로 비슷한 에러가 나오면:

  1. 마운트 대상이 파일인지

  2. 실제로 존재하는지

  3. Docker가 폴더를 자동 생성하지 않았는지

이 세 가지만 먼저 확인해보면 대부분 빠르게 해결할 수 있습니다.

댓글

가장 많이 본 글