Sửa lỗi Mount 'Not a Directory' của Docker: Hướng dẫn thực tế

intermediate🐳 Docker2026-06-05| Docker Engine trên Linux (Ubuntu, CentOS, Debian), Docker Desktop trên macOS hoặc Windows.

Error Message

Error response from daemon: failed to create shim task: OCI runtime create failed: ...: mount through procfd: not a directory: unknown
#docker#volume#mount#oci-runtime

LỗiCác bản triển khai Docker thường bị đình trệ khi việc gắn kết volume gặp lỗi. Có thể bạn đang sử dụng Docker Compose hoặc ánh xạ một tệp nginx.conf đơn giản thì thông báo lỗi sau xuất hiện:

Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/path/on/host/config.conf" to rootfs at "/etc/app/config.conf": mount through procfd: not a directory: unknown

Sự cố này xảy ra trong quá trình khởi tạo container. OCI (Open Container Initiative) runtime, thường là runc, đang cố gắng bind-mount các tệp trên máy chủ của bạn, nhưng nó đã gặp phải sự không khớp về cấu trúc mà nó không thể giải quyết.

Nguyên nhân gốc rễ: Sự không khớp về cấu trúcĐây là một sự xung đột về loại tệp. Docker mong đợi một tệp nhưng lại thấy một thư mục, hoặc ngược lại. Điều này thường bắt nguồn từ một trong ba sai lầm phổ biến sau:

  • Tệp trên máy chủ bị thiếu: Nếu bạn mount /opt/app/settings.conf nhưng tệp đó chưa tồn tại, Docker (đặc biệt là các phiên bản cũ) sẽ giả định bạn muốn một thư mục. Nó tạo một thư mục tên là settings.conf/ trên máy chủ của bạn. Khi container khởi động và mong đợi một tệp, nó sẽ thất bại.- Xung đột Thư mục-thành-Tệp: Bạn đang cố gắng mount một thư mục trên máy chủ vào một đường dẫn bên trong container mà image đã định nghĩa sẵn là một tệp thông thường.- Xung đột Tệp-thành-Thư mục: Bạn đang cố gắng mount một tệp duy nhất trên máy chủ vào một đường dẫn container thực chất là một thư mục.Tham chiếu procfd là một thuật ngữ kỹ thuật viết tắt. Nó có nghĩa là quá trình duyệt bộ mô tả tệp (file descriptor) của kernel đã thất bại vì một thành phần đường dẫn không phải là thư mục như nó khai báo.

Giải pháp 1: Xóa các thư mục tạo nhầmNếu bạn đã chạy docker compose up trước khi thực sự tạo tệp cấu hình, Docker có khả năng đã tạo một thư mục thay thế vào vị trí đó. Đây là nguyên nhân số 1 gây ra lỗi này.

Đầu tiên, hãy kiểm tra loại tệp trên máy chủ của bạn:

ls -ld /path/to/your/host/config.conf

Nếu chuỗi phân quyền bắt đầu bằng d (như drwxr-xr-x), bạn đang có một thư mục trong khi bạn cần một tệp. Hãy làm theo các bước sau để thiết lập lại:

  • Dừng container đang bị lỗi: docker compose down- Xóa thư mục không chính xác: sudo rm -rf /path/to/your/host/config.conf- Tạo tệp thủ công: touch /path/to/your/host/config.conf- Khởi chạy lại: docker compose up -d## Giải pháp 2: Kiểm tra lại Container ImageĐôi khi sự xung đột nằm ngay bên trong chính image. Nếu một Dockerfile sử dụng RUN touch /etc/app/config, đường dẫn đó hiện là một tệp. Việc cố gắng mount một thư mục máy chủ vào chính xác đường dẫn đó sẽ kích hoạt lỗi not a directory. Kiểm tra bên trong image để xem thực sự có gì ở đó:
docker run --rm -it your-image-name ls -ld /etc/app/config

Nếu đích đến là một thư mục, hãy mount tệp của bạn bên trong nó: -v /host/path/config.conf:/etc/app/config/config.conf.

Giải pháp 3: Sử dụng đường dẫn tuyệt đốiĐường dẫn tương đối rất tiện lợi nhưng đầy rủi ro. Việc phân giải đường dẫn của Docker có thể không đoán trước được tùy thuộc vào nơi daemon đang chạy. Nếu bạn đang sử dụng CLI thay vì Compose, hãy luôn chỉ định đường dẫn đầy đủ.

Tránh cách này:

docker run -v ./nginx.conf:/etc/nginx/nginx.conf nginx

Sử dụng cách này thay thế:

docker run -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf nginx

Giải pháp 4: Kiểm tra các Symlink bị hỏngCơ chế procfd của Docker rất nhạy cảm với các symlink (liên kết tượng trưng). Nếu đường dẫn trên máy chủ của bạn trỏ đến một symlink, hãy đảm bảo liên kết đó không bị hỏng. Một symlink trỏ đến một thư mục trong khi Docker mong đợi một tệp sẽ làm hỏng quá trình mount ngay lập tức.

Kiểm tra liên kết của bạn bằng lệnh ls -l /path/on/host/config.conf và xác nhận rằng đích đến tồn tại và đúng loại.

Xác minhSau khi áp dụng bản sửa lỗi, đừng chỉ hy vọng nó hoạt động. Hãy xác minh bằng ba bước sau:

  • Khởi động Container: Đảm bảo nó vượt qua lỗi OCI runtime và chuyển sang trạng thái running.- Kiểm tra các Mount: Chạy lệnh docker inspect <id>. Trong phần "Mounts", hãy xác nhận rằng "Source" và "Destination" trông chính xác như dự định.- Kiểm tra truy cập: Chạy lệnh docker exec -it <id> head -n 5 /path/in/container/config.conf để xem 5 dòng đầu tiên của tệp từ bên trong container.## Mẹo phòng ngừa- Tạo trước các tệp: Sử dụng touch config.env hoặc mkdir -p data trước khi chạy các lệnh Docker. Đừng bao giờ để Docker phải tự đoán.- Ưu tiên Named Volumes: Trừ khi bạn cần chỉnh sửa tệp trong thời gian thực trên máy chủ, hãy sử dụng named volumes (ví dụ: -v app-data:/var/lib/app). Chúng ổn định hơn so với bind mounts.- Dockerfile rõ ràng: Sử dụng RUN mkdir -p /app/config trong Dockerfile của bạn để loại bỏ bất kỳ sự mơ hồ nào về cấu trúc thư mục.

Related Error Notes