Sửa lỗi 'bind source path does not exist' Khi Mount Volume Trong Docker

beginner🐳 Docker2026-03-18| Docker Engine 20+, Docker Compose v2, Linux / macOS / Windows (WSL2)

Error Message

Error response from daemon: invalid mount config for type "bind": bind source path does not exist
#docker#volume#bind-mount#docker-compose

TL;DR

Docker không thể mount một thư mục chưa tồn tại. Hãy tạo thư mục trước, sau đó chạy lại container:

mkdir -p /path/to/your/host/directory
docker run -v /path/to/your/host/directory:/container/path your-image

Với Docker Compose, hãy tạo thư mục thủ công trước khi chạy docker compose up, hoặc chuyển sang dùng named volume để Docker tự quản lý.

Nguyên Nhân Gây Ra Lỗi

Thông báo lỗi đầy đủ là:

Error response from daemon: invalid mount config for type "bind": bind source path does not exist

Bind mount hoạt động bằng cách liên kết trực tiếp một thư mục trên host vào filesystem của container. Docker không tự tạo thư mục đó cho bạn — nó phải tồn tại sẵn. Named volume thì khác; Docker tự quản lý chúng. Còn bind mount? Bạn phải tự chịu trách nhiệm về đường dẫn nguồn.

Các nguyên nhân thường gặp:

  • Gõ sai đường dẫn host (ví dụ: /dat/myapp thay vì /data/myapp)
  • Đường dẫn tương đối trỏ sai thư mục làm việc
  • Thư mục đã bị xóa hoặc chưa được tạo bao giờ
  • Trên Windows/WSL2: nhầm lẫn giữa định dạng đường dẫn Windows và Unix
  • Khối volumes trong Docker Compose trỏ tới đường dẫn host chưa tồn tại

Cách Sửa 1: Tạo Thư Mục Host Còn Thiếu

Chín trong mười trường hợp, đây là tất cả những gì bạn cần. Tìm đường dẫn trong flag -v và tạo nó:

# Lệnh bị lỗi của bạn
docker run -v /data/myapp/config:/app/config myimage

# Tạo thư mục còn thiếu
mkdir -p /data/myapp/config

# Chạy lại — sẽ hoạt động ngay
docker run -v /data/myapp/config:/app/config myimage

Flag -p yêu cầu mkdir tạo tất cả các thư mục cha trong một lần. Không cần tạo /data rồi mới tạo /data/myapp riêng lẻ.

Cách Sửa 2: Kiểm Tra Lỗi Gõ Trước Tiên

Nên làm điều này trước khi tạo bất cứ thứ gì mới — đường dẫn có thể đã tồn tại, chỉ là bị gõ sai:

# Kiểm tra xem có tồn tại không?
ls -la /data/myapp/config

# Kiểm tra nhanh bằng một dòng lệnh
[ -d /data/myapp/config ] && echo "tồn tại" || echo "không tồn tại"

Chỉ một ký tự sai là đủ gây lỗi. /data/myapp/dat/myapp là hai đường dẫn hoàn toàn khác nhau. Kiểm tra từng phần của đường dẫn.

Cách Sửa 3: Docker Compose — Đường Dẫn Tương Đối và Named Volume

Vấn đề này gây nhầm lẫn cho rất nhiều người. Xem ví dụ docker-compose.yml này:

services:
  app:
    image: myimage
    volumes:
      - ./config:/app/config

./config được phân giải tương đối so với vị trí file docker-compose.yml của bạn. Nếu thư mục config chưa có ở đó, Docker sẽ dừng ngay lập tức. Cách sửa rất đơn giản:

# Chạy lệnh này từ cùng thư mục chứa docker-compose.yml
mkdir -p config
docker compose up -d

Không thực sự cần file trong thư mục đó từ trước? Hãy chuyển sang dùng named volume:

services:
  app:
    image: myimage
    volumes:
      - app-config:/app/config

volumes:
  app-config:

Docker tự động tạo named volume trong lần chạy đầu tiên. Dùng bind mount khi bạn cần đọc hoặc ghi file trực tiếp từ host — file cấu hình, build artifact, log cần theo dõi theo thời gian thực.

Cách Sửa 4: Định Dạng Đường Dẫn Trên Windows và WSL2

Docker Desktop trên Windows rất khó tính về định dạng đường dẫn. Dùng sai kiểu cho terminal của bạn và lỗi này sẽ xuất hiện mỗi lần.

Từ PowerShell hoặc CMD:

# Sai — đường dẫn kiểu Unix sẽ không được phân giải
docker run -v /c/Users/you/data:/app/data myimage

# Đúng — dùng dấu gạch chéo ngược của Windows
docker run -v C:\Users\you\data:/app/data myimage

# Cũng đúng — dấu gạch chéo xuôi cũng hoạt động
docker run -v C:/Users/you/data:/app/data myimage

Từ terminal WSL2, hãy dùng đường dẫn Linux:

# Đường dẫn WSL2 thuần túy
docker run -v /home/you/data:/app/data myimage

# Truy cập ổ C: của Windows từ WSL
docker run -v /mnt/c/Users/you/data:/app/data myimage

Nguyên tắc: kiểu đường dẫn phải khớp với shell bạn đang dùng để chạy lệnh.

Cách Sửa 5: Biến Môi Trường Rỗng

Biến trông có vẻ đã được đặt nhưng thực ra chưa sẽ âm thầm tạo ra đường dẫn bị lỗi:

# Nếu $DATA_DIR chưa được đặt, lệnh này thành -v :/app/data — lỗi ngay
docker run -v $DATA_DIR:/app/data myimage

# Kiểm tra trước
echo "DATA_DIR=${DATA_DIR}"

# Thêm giá trị mặc định để tránh expand thành chuỗi rỗng
docker run -v ${DATA_DIR:-/tmp/myapp-data}:/app/data myimage

Biến chưa được đặt sẽ expand thành chuỗi rỗng. Docker sẽ thấy -v :/app/data, không trỏ đến đâu cả.

Xác Nhận Đã Sửa Thành Công

Container đã chạy? Kiểm tra lại xem mount có được thực hiện đúng không:

# Khởi động container có tên
docker run -d --name test-bind -v /data/myapp/config:/app/config myimage

# Xác nhận container đang chạy
docker ps | grep test-bind

# Kiểm tra chi tiết mount
docker inspect test-bind --format '{{ json .Mounts }}' | python3 -m json.tool

Tìm "Type": "bind" trong kết quả, kèm đường dẫn nguồn và đích như mong đợi. Nếu đúng, bạn đã xong.

Với Compose stack:

docker compose up -d
docker compose ps
docker compose exec app ls /app/config

Tóm Tắt Nhanh

  • Named volume — Docker tự tạo và quản lý; không cần đường dẫn host
  • Bind mount — Đường dẫn host phải tồn tại trước khi container khởi động
  • tmpfs mount — Chỉ tồn tại trong bộ nhớ; mất khi container dừng

Chạy trong CI/CD? Thêm bước tạo thư mục trước các lệnh Docker:

mkdir -p ./data ./logs ./config
docker compose up -d

Ba giây chuẩn bị, không còn lỗi bind mount nữa.

Related Error Notes