Ngừng chờ đợi: Khắc phục lỗi Docker bị treo ở 'Sending Build Context'

beginner🐳 Docker2026-07-22| Docker Engine 20.10+, Docker Desktop trên macOS/Windows/Linux

Error Message

Sending build context to Docker daemon [Size > 100MB]...
#docker#devops#performance

Vấn đề: Tại sao quá trình build bị treo trước khi bắt đầuBạn nhấn enter lệnh docker build -t my-app . và chờ đợi. Chờ mãi. Thay vì thấy các bước thực thi, terminal lại dừng ở một dòng duy nhất đầy khó chịu:

Sending build context to Docker daemon  2.45GB

Nếu con số đó lên đến hàng gigabyte, quá trình build sẽ cực kỳ chậm. Thậm chí nó có thể làm crash Docker daemon hoàn toàn. Điều này xảy ra vì Docker sử dụng kiến trúc client-server. Khi bạn kích hoạt một bản build, client sẽ đóng gói mọi tệp trong thư mục hiện tại và gửi nó đến daemon. Việc chuyển giao này diễn ra trước khi Docker kịp xem qua các chỉ dẫn trong Dockerfile của bạn.

Những "thủ phạm" phổ biến làm tăng dung lượng context- Dependencies cục bộ: Các thư mục như node_modules (thường trên 500MB), venv, hoặc target.- Quản lý phiên bản: Thư mục .git đã phình to sau nhiều năm commit.- Dữ liệu và phương tiện: Các bản dump cơ sở dữ liệu (.sql) bị bỏ quên, tệp CSV lớn, hoặc tài nguyên hình ảnh độ phân giải cao.- Sản phẩm build: Các file binary cũ, tệp log, hoặc thư mục dist từ các lần chạy trước.## Bước 1: Tìm ra những thành phần chiếm dung lượng lớnĐừng đoán mò tệp nào là vấn đề. Bạn cần xác định chính xác điều gì đang tiêu tốn không gian. Chạy các lệnh sau trong thư mục gốc của dự án để xem kích thước thư mục:

Trên Linux hoặc macOS:

du -sh * | sort -h

Trên Windows (PowerShell):

ls | Select-Object Name, @{Name="Size(MB)";Expression={$_.Length / 1MB}} | Sort-Object "Size(MB)" -Descending

Hãy tìm bất kỳ thư mục nào không thực sự cần thiết bên trong image container cuối cùng của bạn. Nếu node_modules hiển thị 800MB, đó chính là mục tiêu chính của bạn.

Bước 2: Cách khắc phục — Tạo tệp .dockerignoreGiải pháp hiệu quả nhất là tạo một tệp .dockerignore trong thư mục gốc của dự án. Nó hoạt động giống như .gitignore. Nó yêu cầu Docker client để lại các tệp cụ thể thay vì gửi chúng đến daemon.

Tạo tệp và thêm ngay các "thành phần xấu" tiêu chuẩn này:

# Bỏ qua các dependency (hãy cài đặt chúng bên trong Dockerfile) 
node_modules/
venv/
.venv/

# Bỏ qua quản lý mã nguồn
.git
.gitignore

# Bỏ qua các tệp rác của IDE và hệ điều hành
.idea/
.vscode/
.DS_Store

# Bỏ qua các sản phẩm build và log
dist/
build/
*.log
*.sql
*.zip

Bước 3: Chuyển sang Docker BuildKitCác phiên bản Docker hiện đại bao gồm BuildKit, một engine build thông minh hơn nhiều. Khác với builder cũ, BuildKit chỉ chuyển các tệp thực sự được yêu cầu bởi lệnh COPY hoặc ADD của bạn. Điều này có thể biến một lần chuyển 2GB thành 2MB.

Để sử dụng BuildKit cho một lần build duy nhất, hãy thiết lập biến môi trường trong terminal của bạn:

DOCKER_BUILDKIT=1 docker build -t my-app .

Để khắc phục vĩnh viễn trên Linux, hãy chỉnh sửa tệp /etc/docker/daemon.json của bạn để bao gồm:

{
  "features": {
    "buildkit": true
  }
}

Bước 4: Kiểm tra lại các lệnh COPYNgay cả khi có .dockerignore, một Dockerfile viết "ẩu" vẫn có thể làm chậm quá trình. Tránh sao chép toàn bộ dự án của bạn ở ngay đầu tệp. Điều này làm hỏng bộ nhớ cache layer và buộc phải chuyển dữ liệu không cần thiết.

Cách làm chậm:

COPY . . 
RUN npm install

Cách làm chuyên nghiệp:

# Chỉ sao chép tệp manifest trước
COPY package.json package-lock.json ./
RUN npm install

# Bây giờ mới sao chép phần còn lại của mã nguồn
COPY ./src ./src

Kết quả: Build nhanh tức thìChạy lại bản build của bạn và kiểm tra dòng đầu tiên của đầu ra. Nếu bạn thấy nội dung như thế này:

Sending build context to Docker daemon  142kB

Kích thước đã giảm từ gigabyte xuống kilobyte. Giai đoạn "Sending build context" giờ đây sẽ diễn ra tức thì. Quá trình build của bạn sẽ nhảy thẳng đến chỉ dẫn đầu tiên trong Dockerfile, giúp bạn tiết kiệm hàng phút chờ đợi mỗi ngày.

Related Error Notes