- Tính tái tạo bit-for-bit nghĩa là khi build từ cùng một nguồn thì bất kể build vào lúc nào, ở đâu hay do ai thực hiện, kết quả tạo ra vẫn hoàn toàn giống nhau đến từng byte
- Để đạt được điều này, cần loại bỏ toàn bộ các yếu tố phi tất định như timestamp, cache, metadata... vốn có thể thay đổi nhỏ tùy theo môi trường build
- Nếu trực tiếp build image Docker rồi so sánh xem digest (hash) có trùng với image phát hành chính thức hay không, bất kỳ ai cũng có thể tự mình xác minh độc lập rằng image được phát hành không bị chỉnh sửa: điều này rất quan trọng về mặt bảo mật chuỗi cung ứng
- Image Docker của Arch Linux nay đã được cung cấp dưới dạng có thể tái tạo bit-for-bit, mở rộng cùng cột mốc đã đạt được trước đó vài tháng với image WSL sang phía Docker
- Image này được phát hành với
reprotag riêng, và để đảm bảo tính tái tạo thì pacman key phải bị xóa khỏi image nên không thể dùngpacmanngay lập tức- Cho đến khi có giải pháp phù hợp, do hạn chế này nên trước mắt nó được cung cấp dưới dạng tag riêng
- Nếu muốn cài đặt hoặc cập nhật gói trong container, trước tiên cần chạy
pacman-key --init && pacman-key --populate archlinuxđể tái tạo keyring- Có thể thực hiện theo cách tương tác ở lần chạy đầu tiên, hoặc chạy trong câu lệnh
RUNcủa Dockerfile dùng image này làm base - Với Distrobox, có thể xử lý bằng pre-init hook như
distrobox create -n arch-repro -i docker.io/archlinux/archlinux:repro --pre-init-hooks "pacman-key --init && pacman-key --populate archlinux"
- Có thể thực hiện theo cách tương tác ở lần chạy đầu tiên, hoặc chạy trong câu lệnh
- Tính tái tạo bit-for-bit của image được xác nhận bằng việc digest trùng khớp giữa các lần build, và được kiểm chứng bằng
podman inspect --format '{{.Digest}}' <image>cùng so sánh vớidiffoci - Có thể xem cách tái tạo image Docker này trong
REPRO.md
Triển khai và các điều chỉnh
- Thách thức lớn nhất là build rootFS base cho image Docker theo cách tất định, và quy trình giống hệt image WSL dùng chung hệ thống build rootFS đã được tái sử dụng
- Có thể xem commit WSL liên quan tại đây
- Một trong các điều chỉnh riêng cho Docker là thiết lập
SOURCE_DATE_EPOCH, đồng thời căn chỉnh LABELorg.opencontainers.image.createdtrong Dockerfile để cũng tuân theo giá trị này - Trong image đã build, file cache phụ
ldconfiglàvar/cache/ldconfig/aux-cache, thứ gây ra tính phi tất định, đã bị xóa ở bước Dockerfile - Khi dùng
docker buildhoặcpodman build, các tùy chọn--source-date-epoch=$SOURCE_DATE_EPOCHvà--rewrite-timestampđược dùng để áp dụng chuẩn hóa timestamp- Ví dụ được nêu ra là thời gian của
etc/,etc/ld.so.cache,etc/os-release,sys/,var/cache/,var/cache/ldconfig/,proc/,dev/từng bị ghi khác nhau
- Ví dụ được nêu ra là thời gian của
- Có thể xem chi tiết đầy đủ các thay đổi liên quan trong merge request diff của kho
archlinux-docker - Bước tiếp theo được cân nhắc là dựng rebuilder trên server cho image Docker, image WSL, và các image có thể tái tạo trong tương lai để tự động rebuild định kỳ, xác minh tính tái tạo, đồng thời công khai log build và kết quả
1 bình luận
Ý kiến trên Hacker News
Thật đáng mừng khi thấy kiểu tự tin này
Tôi đã chạy Arch Linux trên WSL 2 gần 1 năm và thấy rất tuyệt, sau đó dùng Arch native khoảng 5 tháng nữa và cũng rất hài lòng
Đến giờ tôi vẫn tiếp tục dùng Arch native, và dotfiles được tôi kiểm thử bằng Arch Docker image trên một filesystem sạch
Khi cần kiểm thử end-to-end bao gồm cả việc thiết lập toàn bộ môi trường desktop, tôi chạy Arch trong VM
Tôi cũng có rất nhiều vấn đề, nhưng ít nhất thì bản thân Arch không phải là một trong số đó
Tôi đang tìm một bộ dotfiles cấp enterprise còn hỗ trợ cả metric Prometheus và health probe nữa, nên nghe đúng là mang vibe như vậy
Trước giờ tôi chưa từng nghĩ mình cần nó, nhưng vừa nhìn thấy là lại thấy cần ngay
Nếu có thì cũng muốn nghe cảm nhận của bạn
Tôi nghĩ mọi Docker container vốn dĩ nên như thế này
Chạy
apt-get updateở bước docker build gần như là một anti-patternTôi đã dùng thử và nó hoạt động khá tốt
Không cập nhật thì container sẽ tích tụ các vấn đề bảo mật đã biết, còn cập nhật thì lại làm hỏng tính tái lập
Tính tái lập rõ ràng rất hay và cũng có lợi ích về bảo mật, nhưng khi container đã quá một tháng thì nó có thể bắt đầu giống như lệch khỏi mục tiêu, và có lẽ tuổi thọ tối đa phù hợp hơn nên tính theo ngày
Ý là phải tải source code đã được gắn tag rồi tự biên dịch mọi thứ bằng gcc sao?
Container tái lập được đúng là tốt, nhưng không phải lúc nào cũng cần, và cũng có rất nhiều trường hợp bạn cứ chạy
apt-gettrong container mà không cần bận tâm đến tính tái lậpDĩ nhiên vẫn có cách lấy từ archive
Image tái lập được thường dễ bị xem là một tính năng chỉ mang lại cảm giác thỏa mãn về mặt tinh thần trong ngày thường, nhưng rồi sẽ có lúc nó trở nên thực sự cần thiết
Chúng tôi từng có hai image lẽ ra phải giống hệt nhau nhưng lại tạo ra chênh lệch 3 byte ở timestamp trên hai máy khác nhau, và vì thế mà mất nguyên một buổi chiều để bisect theo sai hướng
Không hào nhoáng, nhưng rõ ràng là một chiến thắng rất đáng giá
Có lẽ tôi sẽ cài gì đó để mọi người đều biết rằng tôi dùng Arch trong CI/CD pipeline
Tiện thể cũng cho họ biết luôn là tôi tập Crossfit nữa
Nếu bạn gặp một người vừa ăn chay, vừa tập CrossFit, lại còn là người dùng Arch, thì họ sẽ nói cho bạn biết điều gì trước tiên?
Có thể xem thông tin về Reproducible Builds tại đây
https://reproducible-builds.org/
Cộng đồng Bootstrappable Builds có liên quan chặt chẽ nằm ở đây
https://bootstrappable.org/
Tôi tự hỏi liệu về lâu dài những hệ điều hành mutable được thiết kế tốt như Arch hay Alpine có thể đánh bại những hệ thống như NixOS hay không
Vì script cài đặt có tính biểu đạt cao hơn ngôn ngữ cấu hình khai báo, mà nhìn chung lại cũng không dài dòng hơn
Bạn sẽ có cả ngôn ngữ cấu hình khai báo, đồng thời có luôn một ngôn ngữ lập trình Turing-complete dễ viết
Tôi đã đọc bài và thấy khá ấn tượng, nhưng có cảm giác họ đang dùng lẫn lộn giữa Dockerfile và docker image
Có lẽ sẽ dễ hơn nếu họ dùng thứ như nix để build trực tiếp file tar của image thay vì Dockerfile, dù đúng là sẽ hơi mang tính cực khách nhưng có lẽ vẫn gọn gàng hơn
Chỉ là một góp ý nhỏ thôi nhưng tôi nghĩ dùng thuật ngữ OCI Image sẽ chính xác hơn
Nó cũng chạy hoàn toàn ổn với podman
Tôi thật sự rất kính nể những người đã biến điều này thành hiện thực
Thời gian và công sức cần bỏ ra để tạo nên một dòng tiêu đề như thế này lớn hơn rất nhiều so với tưởng tượng
Chuyện hoàn toàn khác, nhưng trên trang đó có một animation khiến gần như mọi phần tử trên trang dịch xuống khoảng 20 pixel trong vòng 1 giây
Nhìn layout rung lắc ngay trước mắt nên tôi tưởng nó sẽ phá nát CLS, nhưng CLS thực tế lại là 0
Vậy nên tôi bắt đầu tự hỏi có phải CLS là một chỉ số dễ gây hiểu nhầm không
CLS xử lý các thay đổi ở lần render ban đầu, nên dù trông giống layout shift thì đó không phải loại sẽ bị tính vào CLS
Đó là chuyển động do CSS transition tạo ra, là thay đổi có thể dự đoán được, nên không bị tính là layout shift