Ghim theo digest, không ghim theo thẻ latest
Mỗi manifest trong danh mục Keenrig ghim một digest cụ thể và được ký Ed25519. Đây là lý do vì sao, và vì sao "dùng thẻ latest cho tiện" là một cái bẫy chậm.
Một thẻ image không phải là một định danh. Nó là một con trỏ, và con trỏ đó đổi được bất cứ lúc nào bởi người khác. Cài lại cùng một ứng dụng sau sáu tháng bằng thẻ latest thì bạn nhận về một phần mềm khác, và không có gì trên máy bạn ghi lại việc đó đã xảy ra.
Manifest trong danh mục Keenrig trông như sau — chú ý là có cả thẻ lẫn digest, và digest mới là thứ được dùng để kéo image:
{
"id": "nginx",
"title": "Nginx",
"version": "1.27.4",
"repository": "docker.io/library/nginx",
"tag": "1.27.4-alpine",
"digest": "sha256:4ff102c5d78d254a…",
"http_port": 80,
"min_memory_mb": 64
}Thẻ vẫn có ích, chỉ là không phải để kéo
Chúng tôi giữ lại thẻ vì nó là thứ con người đọc được: "1.27.4-alpine" nói cho bạn biết bạn đang chạy gì, còn digest thì không nói gì cả. Nhưng khi kéo image, chỉ digest được dùng. Hai trường này phục vụ hai đối tượng khác nhau và không được lẫn lộn vai trò.
Chữ ký giải bài toán còn lại
Ghim digest bảo đảm bạn nhận đúng image, nhưng chưa bảo đảm chính manifest không bị đổi trên đường truyền. Nên toàn bộ danh mục được ký Ed25519, và instance xác minh chữ ký trước khi tin bất cứ dòng nào trong đó. Khoá xác minh nằm sẵn trong binary — không có bước "tải khoá về rồi tin nó".
Danh mục ngoại tuyến là mặc định
Một tập danh mục tối thiểu được nhúng thẳng vào binary. Lý do rất thực tế: nếu danh mục phải tải từ mạng lúc khởi động thì "mất mạng" biến thành "không cài được ứng dụng nào", và máy chủ phát hành danh mục trở thành một điểm chết cho mọi instance trên đời. Danh mục từ xa vẫn tồn tại — nó là phần cộng thêm vào tập nhúng sẵn, không phải thứ thay thế nó.