Sửa lỗi 'go: updates to go.sum needed, disabled by -mod=readonly' trong Go Modules

trung bình🔷 Go2026-04-10| Linux, macOS, Windows, Go 1.14+, Docker, GitHub Actions, GitLab CI

Error Message

go: updates to go.sum needed, disabled by -mod=readonly
#go#go-modules#go.sum#ci-cd#docker

Sự cố Pipeline lúc 2 giờ sángBạn vừa push code, các bài test local đều vượt qua và bạn đã sẵn sàng nghỉ ngơi. Thế nhưng, pipeline CI/CD lại báo đỏ. Bạn kiểm tra log và thấy lỗi gây nghẽn khó chịu này:

go: updates to go.sum needed, disabled by -mod=readonly

Lỗi này thường xảy ra trong quá trình build Docker hoặc chạy CI. Điều đó có nghĩa là Go toolchain cần cập nhật file go.sum với các mã checksum còn thiếu, nhưng nó bị hạn chế thay đổi. Kể từ Go 1.16, nhiều lệnh mặc định ở chế độ -mod=readonly để đảm bảo các bản build là bất biến và có thể tái lập.

Tại sao lỗi này xảy raGo yêu cầu go.modgo.sum phải đồng bộ hoàn toàn với nhau. Nếu bạn thêm một dependency hoặc chỉnh sửa go.mod thủ công mà không chạy lệnh đồng bộ, go.sum sẽ bị lỗi thời. Ở môi trường local, Go có thể tự động sửa lỗi này một cách âm thầm. Tuy nhiên, trong môi trường CI như GitHub Actions hoặc GitLab CI, hệ thống file thường được coi là chỉ đọc (read-only) đối với các dependency. Điều này ngăn chặn các cập nhật "ngầm" có thể ảnh hưởng đến bảo mật hoặc tính ổn định của bản build.

Cách khắc phục### 1. Giải pháp triệt để: go mod tidyNguyên nhân phổ biến nhất là file go.sum thiếu các mục cho các dependency được liệt kê trong go.mod. Hãy mở terminal và chạy:

go mod tidy

Lệnh này là "người bạn thân nhất" của bạn. Nó thêm các yêu cầu module còn thiếu cho các import và loại bỏ những cái không sử dụng. Quan trọng nhất, nó tạo ra các mã checksum chính xác mà dự án của bạn cần và dọn dẹp sơ đồ module.

2. Đừng quên commit thay đổiĐây là một sai lầm phổ biến: bạn chạy go mod tidy, thấy nó hoạt động ở local, nhưng lại quên commit file go.sum đã cập nhật. Runner CI của bạn chỉ biết những gì có trong repository. Nếu bạn không push các thay đổi, CI vẫn sẽ thấy trạng thái cũ bị lỗi và khiến bản build thất bại một lần nữa.

git add go.mod go.sum
git commit -m "fix: đồng bộ dependency và cập nhật go.sum"
git push

3. Sửa lỗi trong Docker BuildNếu lỗi này xuất hiện trong bước RUN go build của Docker, hãy kiểm tra các lệnh COPY của bạn. Nếu bạn copy go.mod nhưng bỏ qua go.sum, trình build của Go sẽ cố gắng tạo file checksum mới ngay lập tức và thất bại. Hãy sử dụng mẫu sau để thay thế:

# Copy cả hai file module trước để tận dụng Docker layer caching
COPY go.mod go.sum ./
RUN go mod download

# Bây giờ copy phần còn lại của mã nguồn
COPY . .
RUN go build -o myapp .

Điều này đảm bảo tất cả mã checksum đều có mặt và được xác minh trước khi quá trình build bắt đầu. Nó cũng giúp việc build Docker nhanh hơn bằng cách tận dụng cache cho bước download.

4. Ép tải lại từ đầuNếu tidy không giải quyết được vấn đề, có thể bạn đang gặp lỗi lệch checksum trong cache local. Hãy thử ép tải lại sạch tất cả các module để đối soát trạng thái:

go mod download
go mod verify

Lệnh verify kiểm tra xem các dependency trong cache local có khớp với mã checksum mong đợi trong go.sum hay không. Nếu lệnh này thành công ở local nhưng thất bại trên CI, chắc chắn file go.sum ở local của bạn chính là vấn đề.

Kiểm tra trước khi PushĐừng đoán xem CI có vượt qua hay không. Bạn có thể mô phỏng sự khắt khe của môi trường CI ngay tại local bằng cách chạy lệnh build với flag readonly được bật:

go build -mod=readonly ./...

Nếu lệnh này kết thúc với mã code 0, các dependency của bạn đã được đồng bộ hoàn hảo. Pipeline của bạn sẽ có màu xanh.

Danh sách kiểm tra nhanh- GOPRIVATE: Nếu bạn sử dụng repo riêng tư, hãy đảm bảo GOPRIVATE đã được thiết lập trong môi trường CI. Nếu Go không thể truy cập module riêng tư để xác minh checksum, nó sẽ thất bại.- Vendoring: Nếu bạn sử dụng thư mục vendor/, hãy chạy go mod vendor sau khi tidy. Thư mục vendor không đồng bộ là nguồn cơn phổ biến của lỗi này.- Phiên bản Go: Sự khác biệt giữa phiên bản Go local (ví dụ: 1.22) và phiên bản trên CI (ví dụ: 1.21) có thể gây ra những khác biệt nhỏ về checksum. Hãy kiểm tra chỉ thị go trong file go.mod của bạn.

Related Error Notes