Sửa lỗi 'docker-credential-desktop: executable file not found in $PATH' khi Docker Login

intermediate🐳 Docker2026-05-26| Linux (Ubuntu/Debian/Fedora), WSL2, hoặc bất kỳ hệ thống nào sử dụng Docker CLI mà không cài đặt Docker Desktop.

Error Message

error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ""
#docker#credentials#docker-login#config.json#docker-credential

Cơn ác mộng triển khai lúc 2 giờ sángBạn đang đẩy một bản vá lỗi (hotfix) quan trọng. Bạn chạy docker login hoặc docker push, kỳ vọng việc xác thực sẽ diễn ra suôn sẻ. Nhưng thay vào đó, terminal hiện ra một thông báo lỗi khó chịu và làm dừng toàn bộ tiến trình (pipeline):

error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ""

Điều này thường xảy ra khi bạn chuyển cấu hình từ môi trường Mac hoặc Windows sang máy Linux thuần túy, hoặc nếu bạn vừa gỡ cài đặt Docker Desktop nhưng vẫn giữ lại các tệp cấu hình cũ. Docker CLI đang tìm kiếm một chương trình hỗ trợ không tồn tại trên hệ thống hiện tại của bạn.

Tại sao Docker lại tìm kiếm 'desktop'?Mặc định, Docker không lưu mật khẩu của bạn dưới dạng văn bản thuần túy. Nó sử dụng các "credential helpers"—các tệp thực thi nhỏ bên ngoài giao tiếp với trình quản lý mật khẩu của hệ điều hành (như Keychain trên macOS hoặc Windows Credential Manager). Trên Windows và Mac, Docker Desktop tự đặt mình làm trình hỗ trợ mặc định, được gọi là docker-credential-desktop.

Khi bạn sao chép tệp ~/.docker/config.json sang máy chủ Linux hoặc một bản cài đặt WSL2 không có Docker Desktop, Docker CLI vẫn cố gắng tìm kiếm tệp thực thi cụ thể đó. Vì nó không nằm trong biến môi trường $PATH của bạn, lệnh sẽ thất bại ngay lập tức.

Cách sửa nhanh: Dọn dẹp cấu hìnhNếu bạn chỉ cần đăng nhập thành công ngay bây giờ, cách nhanh nhất là yêu cầu Docker ngừng tìm kiếm trình hỗ trợ desktop. Hãy mở tệp cấu hình Docker của bạn:

nano ~/.docker/config.json

Tìm dòng có nội dung như sau:

{
  "auths": { ... },
  "credsStore": "desktop"
}

Xóa hoàn toàn dòng "credsStore": "desktop". Nếu đó là mục cuối cùng trong đối tượng, hãy đảm bảo bạn xóa cả dấu phẩy ở cuối dòng trước đó để giữ cho cấu trúc JSON hợp lệ. Tệp của bạn sẽ trông giống như thế này:

{
  "auths": {
    "https://index.docker.io/v1/": {}
  }
}

Lưu tệp và thử docker login lại. Bây giờ nó sẽ yêu cầu bạn nhập tên người dùng và mật khẩu, sau đó lưu chúng (thường là dưới dạng văn bản thuần hoặc định dạng base64 cục bộ; cách này không tối ưu về bảo mật nhưng hiệu quả để sửa lỗi nhanh chóng).

Cách sửa triệt để: Bảo mật thông tin xác thực trên LinuxViệc xóa dòng credsStore tuy hiệu quả, nhưng nó khiến thông tin xác thực của bạn dễ bị lộ trong config.json dưới dạng chuỗi mã hóa base64. Cách tiếp cận tốt hơn là sử dụng một trình hỗ trợ xác thực thuần Linux (Linux-native credential helper).

Tùy chọn 1: Sử dụng 'pass' (Cách tiêu chuẩn)Tiện ích pass là kho lưu trữ thông tin xác thực phổ biến nhất cho Docker trên Linux. Trước tiên, hãy cài đặt các gói cần thiết:

sudo apt-get update
sudo apt-get install pass docker-credential-helpers

Tiếp theo, bạn cần khởi tạo một khóa GPG nếu chưa có:

gpg --generate-key
# Làm theo các hướng dẫn để tạo khóa

# Liệt kê các khóa của bạn để lấy ID
gpg --list-secret-keys --keyid-format LONG

# Khởi tạo pass với ID khóa của bạn
pass init "YOUR_KEY_ID"

Bây giờ, hãy cập nhật ~/.docker/config.json để sử dụng trình hỗ trợ pass:

{
  "auths": { ... },
  "credsStore": "pass"
}

Tùy chọn 2: Sử dụng 'secretservice'Nếu bạn đang ở trong môi trường Linux máy tính để bàn (như Ubuntu Desktop), bạn có thể sử dụng trình hỗ trợ Secret Service tích hợp với GNOME Keyring hoặc KWallet:

sudo apt-get install docker-credential-secretservice

Sau đó cập nhật config.json:

{
  "credsStore": "secretservice"
}

Xác minh kết quảSau khi thực hiện các thay đổi này, hãy xác minh xem Docker đã sử dụng kho lưu trữ mới chính xác chưa bằng cách đăng nhập lại:

docker login

Sau khi đăng nhập thành công, hãy kiểm tra tệp ~/.docker/config.json. Bạn sẽ thấy một mục trong phần auths cho registry, nhưng không được có thuộc tính auth chứa chuỗi base64. Thay vào đó, thông tin xác thực đã được lưu trữ an toàn trong trình hỗ trợ mà bạn đã chọn.

Mẹo và Cách phòng ngừaKhi chỉnh sửa config.json bằng tay, bạn rất dễ để thừa một dấu phẩy hoặc thiếu một dấu ngoặc nhọn, khiến Docker báo lỗi "invalid character". Mỗi khi tinh chỉnh các tệp này trên máy chủ không có giao diện (headless), tôi thường dùng một trình định dạng (formatter) để kiểm tra cấu trúc trước khi lưu.

Cá nhân tôi thường dùng JSON Formatter & Validator từ ToolCraft để đảm bảo cấu hình được sạch sẽ. Công cụ này chạy trên trình duyệt và hoạt động cục bộ, nên bạn không phải lo lắng về việc dữ liệu cấu hình bị gửi lên máy chủ. Nó thực sự là cứu cánh khi bạn phải xử lý các đối tượng auths phức tạp hoặc cấu hình lồng nhau. Bằng cách làm theo các bước này, bạn đã chuyển từ một lỗi đặc thù của môi trường sang một thiết lập xác thực Linux bảo mật và mạnh mẽ. Sẽ không còn những rào cản triển khai lúc 2 giờ sáng nữa.

Related Error Notes