Những container thoát ngay với exec format error gợi ra phản xạ sai: thêm capability, gắn thiết bị, sửa cấu hình đường hầm. Không cách nào trong số đó chạm tới vấn đề. Nhân không thể thực thi tệp nhị phân chút nào, điều này trong container gần như luôn có nghĩa là image nhắm tới kiến trúc CPU khác với máy chủ. Mọi thứ bạn có thể thay đổi về định tuyến, thông tin đăng nhập hoặc quyền đều diễn ra sau khi một chương trình đã khởi động, và không chương trình nào khởi động.

Thông báo khởi động trông giống lỗi cấu hình

Lỗi định dạng exec đến từ bộ nạp, trước khi ứng dụng đọc dù chỉ một cài đặt. Vì thế nó không tạo ra cảnh báo cấu hình hay nhật ký đường hầm, bởi không có tiến trình sống nào để ghi chúng. Lỗi cũng nhanh đến đáng kinh ngạc, thường trước cả khi một dòng xuất hiện trong nhật ký container. Cùng thông báo ngắn đó xuất hiện dù tệp nhị phân dành cho kiến trúc khác, hệ điều hành khác hay bị hỏng.

Ghi lại môi trường chạy và kiến trúc cùng với tham chiếu image chính xác, rồi kiểm tra xem tham chiếu đó thực sự cung cấp gì. Trên Docker Desktop, nền tảng của container thuộc về máy ảo Linux chứ không phải laptop, nên chỉ riêng kiến trúc máy chủ có thể gây nhầm lẫn. Đọc danh sách mục chỉ mục cho tham chiếu này, không phải văn bản tiếp thị trên trang thẻ của nó.

Đọc chỉ mục image trước lệnh chạy

Khi registry công bố tham chiếu đa nền tảng, thẻ trỏ tới một chỉ mục, và mỗi mục nêu tên một nền tảng với digest riêng. Kiểm tra tham chiếu đang được xem xét chứ không phải thẻ bên cạnh, và đọc chỉ mục thay vì giả định nội dung của nó.

docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4

Lệnh đầu tiên liệt kê các nền tảng mà tham chiếu công bố. Lệnh thứ hai báo cáo nền tảng của image đã có sẵn cục bộ, và đó chính là thứ môi trường chạy sẽ thực thi. Một tham chiếu chỉ có một mục nghĩa là mọi máy chủ nhận cùng một tệp nhị phân, và thẻ không thể giúp một máy mà nó chưa từng được xây dựng cho.

Thẻ chọn một biến thể; chúng không tạo ra biến thể

Chỉ mục đa nền tảng cho phép môi trường chạy chọn một mục phù hợp, điều này thật sự tiện lợi và thường bị nhầm với tính khả chuyển. Việc chọn là tra cứu, không phải dịch: nếu biến thể không có, không có gì để chọn. Vì vậy cùng một thẻ trên hai máy chủ có thể dẫn tới hai tệp nhị phân khác nhau, và trên một máy chủ thì không dẫn tới thứ gì dùng được.

Ghim bằng digest loại bỏ sự mơ hồ và cũng cho phép xem xét lại sau này, vì digest xác định chính xác các byte đã được kiểm thử. Giữ digest đó cùng với hồ sơ triển khai thay vì dựa vào thẻ tình cờ là hiện hành.

Giả lập là một thỏa thuận, không phải lớp dịch

Giả lập qua môi trường chạy được hỗ trợ có thể chạy một số khối lượng công việc không gian người dùng không bản địa, nên tuyên bố tuyệt đối rằng một kiến trúc không bao giờ có thể chạy image của kiến trúc khác là sai. Đây cũng không phải giải pháp chung. Thực thi giả lập có đặc điểm hiệu năng khác, và một tiến trình tầm thường khởi động không cho bạn biết gì về việc khối lượng công việc đường hầm có hoạt động chấp nhận được hay không.

Hướng dẫn đa nền tảng của Docker coi bản dựng gốc, biên dịch chéo và giả lập là các chiến lược riêng biệt, và đó là cách đúng để đọc các tùy chọn. Hãy chọn một cách có chủ đích, và đánh giá khối lượng công việc VPN dưới nó thay vì giả định sự tương đương.

Quyền giải quyết một vấn đề khác

Cấp capability quản trị mạng hoặc chuyển tiếp thiết bị TUN không thể làm cho một tệp thực thi không tương thích chạy được. Đây là các quyền thời gian chạy mà một tiến trình đang chạy sử dụng; chúng vô hình với bộ nạp đã từ chối tệp.

Điều ngược lại cũng đúng như vậy. Một tệp nhị phân bản địa không chứng minh gì về đặc quyền, truy cập thiết bị, tích hợp resolver hay chính sách khởi động lại mà đường hầm cần, vì vậy một container khởi động vẫn chưa phải container hoạt động. Thiết lập hợp đồng nền tảng trước, rồi chuyển sang hợp đồng thời gian chạy với các tùy chọn được tài liệu hóa.

Giữ digest image, mục tiêu được hỗ trợ và cấu hình cùng nhau trong một hồ sơ. Một bản cập nhật thẻ âm thầm thay đổi kiến trúc dễ bị phát hiện hơn khi digest trước đó được ghi lại, so với khi triệu chứng duy nhất là một lỗi quen thuộc và một buổi chiều mới dành cho gỡ lỗi.

Bài viết liên quan