- bit-for-bit पुनरुत्पादकता का मतलब है कि एक ही source से build करने पर, कब, कहाँ, या किसने build किया हो, परिणाम byte स्तर तक पूरी तरह एक जैसा हो
- इसे हासिल करने के लिए timestamps, cache, metadata जैसी सभी non-deterministic चीज़ों को हटाना पड़ता है, जो build environment के अनुसार थोड़ा बदल सकती हैं
- अगर Docker image को सीधे build करके official distribution image के digest (hash) से उसकी समानता की तुलना की जाए, तो कोई भी व्यक्ति स्वतंत्र रूप से सत्यापित कर सकता है कि वितरित image के साथ छेड़छाड़ नहीं हुई है: यह supply chain security के लिहाज़ से महत्वपूर्ण है
- Arch Linux की Docker image अब bit-for-bit पुनरुत्पादक रूप में उपलब्ध है, और कुछ महीने पहले WSL image में हासिल किए गए इसी milestone को अब Docker तक बढ़ाया गया है
- यह image समर्पित
reprotag के साथ वितरित की जाती है, और पुनरुत्पादकता सुनिश्चित करने के लिए image से pacman keys हटानी पड़ती हैं, इसलिएpacmanको तुरंत इस्तेमाल नहीं किया जा सकता- उपयुक्त समाधान मिलने तक, इस सीमा के कारण इसे फिलहाल अलग tag के रूप में उपलब्ध कराया गया है
- container के अंदर package install या update करने के लिए पहले
pacman-key --init && pacman-key --populate archlinuxचलाकर keyring को दोबारा बनाना ज़रूरी है- पहली बार चलाने पर इसे interactive तरीके से किया जा सकता है, या इस image को base बनाकर Dockerfile के
RUNstatement में चलाया जा सकता है - Distrobox में इसे
distrobox create -n arch-repro -i docker.io/archlinux/archlinux:repro --pre-init-hooks "pacman-key --init && pacman-key --populate archlinux"जैसे pre-init hook से संभाला जा सकता है
- पहली बार चलाने पर इसे interactive तरीके से किया जा सकता है, या इस image को base बनाकर Dockerfile के
- image की bit-for-bit पुनरुत्पादकता को builds के बीच digest match से जांचा जाता है, और इसे
podman inspect --format '{{.Digest}}' <image>तथाdiffociकी तुलना से सत्यापित किया जाता है - इस Docker image को पुनरुत्पादित करने का तरीका
REPRO.mdमें देखा जा सकता है
कार्यान्वयन और समायोजन
- Docker image के लिए base rootFS को deterministically build करना सबसे बड़ी चुनौती थी, और rootFS build system साझा करने वाली WSL image की उसी प्रक्रिया का फिर से उपयोग किया गया
- संबंधित WSL commit यहाँ देखा जा सकता है
- Docker-विशेष समायोजनों में से एक
SOURCE_DATE_EPOCHसेट करना था, और Dockerfile केorg.opencontainers.image.createdLABEL को भी उसी के अनुसार मिलाया गया - build की गई image में non-determinism पैदा करने वाली
ldconfigकी सहायक cache filevar/cache/ldconfig/aux-cacheको Dockerfile चरण में हटा दिया गया docker buildयाpodman buildके समय--source-date-epoch=$SOURCE_DATE_EPOCHऔर--rewrite-timestampoptions का उपयोग करके timestamp normalization लागू की गई- उदाहरण के तौर पर
etc/,etc/ld.so.cache,etc/os-release,sys/,var/cache/,var/cache/ldconfig/,proc/,dev/के timestamps अलग-अलग दर्ज हो रहे थे
- उदाहरण के तौर पर
- संबंधित सभी बदलावों को
archlinux-dockerrepository के merge request diff में और विस्तार से देखा जा सकता है - आगे के चरण के रूप में Docker image, WSL image, और भविष्य की पुनरुत्पादक images के लिए server पर rebuilder स्थापित करने पर विचार हो रहा है, ताकि नियमित automatic rebuild, पुनरुत्पादकता सत्यापन, और build logs व परिणामों का सार्वजनिक प्रकाशन किया जा सके
1 टिप्पणियां
Hacker News की राय
ऐसा आत्मविश्वास देखना अच्छा लगता है
मैंने लगभग 1 साल तक WSL 2 पर Arch Linux चलाया और अनुभव बहुत अच्छा रहा, फिर करीब 5 महीने तक native Arch इस्तेमाल किया और उससे भी संतुष्ट रहा
अभी भी native Arch ही इस्तेमाल कर रहा हूँ, और अपने dotfiles को एक साफ़ filesystem पर Arch Docker image के साथ test करता हूँ
जब end-to-end test की ज़रूरत होती है, जिसमें पूरा desktop environment सेट करना हो, तब VM में Arch चलाता हूँ
मेरी ज़िंदगी में समस्याएँ बहुत हैं, लेकिन कम से कम Arch उनमें से एक नहीं है
मैं तो Prometheus metrics और health probe तक सपोर्ट करने वाला enterprise-grade dotfiles setup ढूँढ रहा था, और यह बिल्कुल वैसा ही लग रहा है
मुझे अब तक लगा ही नहीं था कि इसकी ज़रूरत है, लेकिन देखते ही लगा कि यह चाहिए
अगर किए हैं, तो उस पर आपकी प्रतिक्रिया भी सुनना चाहूँगा
मेरा मानना है कि सारे Docker container मूल रूप से ऐसे ही होने चाहिए थे
docker build स्टेज में
apt-get updateचलाना लगभग anti-pattern हैमैंने खुद इस्तेमाल किया है, और यह काफ़ी अच्छा चला
अगर update नहीं करते, तो container में ज्ञात security issues जमा होते जाते हैं, और अगर update करते हैं, तो reproducibility टूट जाती है
reproducibility निश्चित ही शानदार है और इसके security फायदे भी हैं, लेकिन container एक महीना पुराना होते ही शायद लक्ष्य से बाहर जैसा लगने लगे, और इसकी अधिकतम उम्र शायद दिन के हिसाब से सोचना ज़्यादा सही हो
क्या मतलब यह है कि tagged source code लाओ और gcc से सब कुछ खुद compile करो?
reproducible container अच्छी चीज़ है, लेकिन हर बार ज़रूरी नहीं, और बहुत से मामलों में container के अंदर
apt-getचलाना ठीक है, भले reproducibility की परवाह न की जाएहालाँकि archive से लाने का तरीका तो होता ही है
reproducible image अक्सर रोज़मर्रा में बस भावनात्मक संतोष देने वाली सुविधा लग सकती है, लेकिन एक दिन इसकी सच में ज़रूरत पड़ती है
हमारे यहाँ भी दो image, जो एक जैसे होने चाहिए थे, अलग-अलग machine पर timestamp में 3 byte का अंतर दे रहे थे, और उसी वजह से हम गलत दिशा में bisect करते हुए पूरा एक दोपहर बर्बाद कर बैठे
यह कोई चमकदार जीत नहीं थी, लेकिन इसकी कीमत ज़रूर थी
शायद कोई ऐसी चीज़ जोड़ना संभव होगा जो सबको बता दे कि आप CI/CD pipeline में Arch इस्तेमाल करते हैं
जैसे Crossfit करने की बात भी सबको बता देते हैं
अगर आप किसी vegan crossfitter और Arch user से मिलें, तो वह सबसे पहले आपको क्या बताएगा?
Reproducible Builds के बारे में जानकारी यहाँ है
https://reproducible-builds.org/
इससे क़रीब से जुड़ा Bootstrappable Builds समुदाय यहाँ है
https://bootstrappable.org/
सोचता हूँ कि क्या Arch या Alpine जैसे अच्छी तरह डिज़ाइन किए गए mutable operating system लंबी अवधि में NixOS जैसे सिस्टम से आगे निकल सकते हैं
क्योंकि install scripts, declarative configuration language की तुलना में अधिक expressive होती हैं, और आम तौर पर ज़्यादा लंबी-चौड़ी भी नहीं होतीं
वहाँ आपको declarative configuration language भी मिलती है, और साथ ही एक Turing-complete, उपयोगी programming language भी
मैंने लेख पढ़ा, और यह काफ़ी अच्छा लगा, लेकिन ऐसा लगा कि इसमें Dockerfile और docker image को थोड़ा मिलाकर बताया गया है
Dockerfile की जगह अगर nix जैसी किसी चीज़ से सीधे image tar file बनाई जाती, तो शायद यह आसान होता; हाँ, थोड़ा niche होता, लेकिन फिर भी ज़्यादा साफ़-सुथरा लगता
छोटी-सी बात है, लेकिन मुझे लगता है OCI Image शब्द ज़्यादा सही है
यह podman में भी बिना किसी समस्या के चलता है
जिन्होंने इसे वास्तव में संभव बनाया, उनके लिए बहुत सम्मान
सिर्फ़ ऐसा headline बना पाने के लिए जितना समय और मेहनत लगती होगी, वह कल्पना से परे है
पूरी तरह अलग बात, लेकिन उस page में एक animation है, जिसकी वजह से 1 सेकंड के लिए page के लगभग सभी elements लगभग 20 pixel नीचे खिसकते हैं
सामने layout हिलता हुआ दिख रहा था, इसलिए लगा कि यह CLS को बुरी तरह बिगाड़ देगा, लेकिन असल CLS 0 था
इससे सोचने लगा कि कहीं CLS कोई भ्रामक metric तो नहीं
CLS initial rendering के समय होने वाले बदलावों को देखता है, इसलिए भले यह layout movement जैसा दिखे, यह उस तरह की चीज़ नहीं है जो CLS में गिनी जाए
वह CSS transition से होने वाली movement है, यानी अपेक्षित बदलाव, इसलिए उसे layout shift के रूप में नहीं गिना जाता