TL;DR
Docker không tìm thấy Dockerfile của bạn vì nó không nằm trong thư mục build context bạn chỉ định. Hãy chạy docker build từ thư mục chứa Dockerfile, hoặc chỉ định trực tiếp đường dẫn đến file bằng -f:
# Cách 1: di chuyển vào thư mục trước
cd /path/to/your/project
docker build -t myapp .
# Cách 2: giữ nguyên thư mục hiện tại, chỉ định đường dẫn file
docker build -f /path/to/your/project/Dockerfile -t myapp .
Nguyên nhân
Mỗi lệnh docker build đều nhận một build context — thư mục mà Docker đóng gói và gửi tới daemon. Mặc định (khi bạn truyền .), đó là thư mục làm việc hiện tại của bạn. Daemon sau đó sẽ tìm kiếm Dockerfile bên trong thư mục đó.
Thông báo lỗi đầy đủ trông như sau:
failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory
Có một số nguyên nhân phổ biến gây ra lỗi này:
- Bạn chạy
docker build .từ sai thư mục —Dockerfilenằm ở nơi khác. - File có tên khác:
dockerfile,Dockerfile.dev,DockerFile— hệ thống file Linux phân biệt chữ hoa/thường, nên các tên này sẽ không khớp. - Ai đó vô tình thêm
Dockerfilevào.dockerignore. - Đường dẫn build context bạn chỉ định không chứa
Dockerfilenào. - Trong CI/CD, thư mục làm việc của pipeline không đúng với những gì config giả định.
Cách sửa từng bước
Bước 1: Xác nhận vị trí thực sự của Dockerfile
# Linux — tìm kiếm phân biệt chữ hoa/thường
find . -name 'Dockerfile' -type f
# macOS — filesystem không phân biệt chữ hoa/thường, nhưng vẫn nên kiểm tra
find . -iname 'dockerfile' -type f
Không có kết quả? File chưa tồn tại — hãy tạo nó. Tìm thấy ở đường dẫn không mong đợi? Hãy di chuyển file đó, hoặc dùng -f để trỏ Docker đến đúng vị trí.
Bước 2: Chạy docker build từ đúng thư mục
Lỗi điển hình: chạy docker build . từ thư mục cha hoặc thư mục cùng cấp. Dấu . có nghĩa là "dùng thư mục hiện tại làm build context", và Docker sẽ tìm Dockerfile bên trong thư mục đó.
# Sai — bạn đang ở /home/user nhưng Dockerfile lại ở /home/user/myapp
docker build -t myapp .
# Đúng — cd vào thư mục trước, rồi mới build
cd myapp
docker build -t myapp .
Chỉ cần một lệnh cd là xong.
Bước 3: Dùng -f cho tên file hoặc vị trí không chuẩn
Các dự án có nhiều môi trường thường giữ các Dockerfile riêng biệt — mỗi stage một file. Hãy chỉ định đường dẫn rõ ràng thay vì đổi tên file liên tục:
# File có tên không phải mặc định
docker build -f Dockerfile.prod -t myapp .
# File nằm trong thư mục con
docker build -f docker/Dockerfile -t myapp .
# File nằm ngoài build context (ít gặp nhưng hợp lệ)
docker build -f ../Dockerfile -t myapp .
Lưu ý quan trọng: -f và build context (đối số cuối cùng) là độc lập với nhau. Context kiểm soát những file nào daemon có thể truy cập trong quá trình build. Cờ -f chỉ xác định file nào được dùng làm Dockerfile. Nhầm lẫn giữa hai thứ này là nguồn gốc của nhiều lỗi khó hiểu.
Bước 4: Kiểm tra .dockerignore
Mở .dockerignore và tìm dòng nào khớp với Dockerfile của bạn:
cat .dockerignore
Nếu Dockerfile được liệt kê ở đó, hãy xóa dòng đó đi. Docker thường xử lý đặc biệt Dockerfile và bỏ qua mục đó — nhưng một số cấu hình BuildKit không tuân theo quy ước này, dẫn đến đúng lỗi bạn đang gặp.
Bước 5: Sửa thư mục làm việc trong CI/CD
GitHub Actions, GitLab CI và Jenkins đều có cách xác định thư mục làm việc riêng. Đừng đoán mò — hãy chỉ định rõ ràng:
# GitHub Actions: đặt working-directory cho từng step
- name: Build Docker image
run: docker build -t myapp .
working-directory: ./myapp
# Hoặc dùng đường dẫn tuyệt đối để tránh nhầm lẫn
- name: Build Docker image
run: docker build -f ${{ github.workspace }}/myapp/Dockerfile -t myapp ${{ github.workspace }}/myapp
# GitLab CI: cd rõ ràng trước khi build
build:
script:
- cd myapp && docker build -t myapp .
Bước 6: Docker Compose — kiểm tra build context trong compose.yaml
Khi lỗi xuất hiện qua lệnh docker compose build, context được lấy từ file compose của bạn, không phải thư mục hiện tại của shell:
# compose.yaml
services:
app:
build:
context: ./myapp # thư mục này phải chứa Dockerfile
dockerfile: Dockerfile # tùy chọn — 'Dockerfile' là mặc định
Kiểm tra lại rằng context trỏ đến đúng thư mục chứa Dockerfile, không phải thư mục cha hoặc thư mục cùng cấp.
Kiểm tra kết quả
Chạy lại lệnh build. Một lệnh chạy thành công sẽ hiển thị output các layer ngay lập tức:
docker build -t myapp .
# Output mong đợi (BuildKit):
[+] Building 3.2s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> [internal] load .dockerignore 0.0s
=> [internal] load metadata for docker.io/library/node:20 1.4s
...
Khi bạn thấy [internal] load build definition from Dockerfile mà không có lỗi ở dòng tiếp theo, nghĩa là mọi thứ đã ổn — Docker đã tìm thấy file.
Tham khảo nhanh: Các tình huống phổ biến
- Sai thư mục →
cdvào thư mục chứaDockerfile, rồi mới build. - Tên file không chuẩn →
docker build -f Dockerfile.prod . - Monorepo / cấu trúc lồng nhau →
docker build -f services/api/Dockerfile .từ thư mục gốc của repo, hoặccd services/api && docker build . - CI pipeline → đặt
working-directoryrõ ràng, hoặc dùng đường dẫn tuyệt đối với-f. - Docker Compose → kiểm tra đường dẫn
context:trongcompose.yaml.

