- bit-for-bit yeniden üretilebilirlik, aynı kaynaktan derleme yapıldığında ne zaman, nerede ve kim tarafından derlenirse derlensin bayt düzeyine kadar tamamen aynı çıktının elde edilmesi anlamına gelir
- Buna ulaşmak için, derleme ortamına göre küçük farklılıklar gösteren zaman damgaları, önbellekler ve metadata gibi tüm deterministik olmayan unsurların kaldırılması gerekir
- Docker imajını doğrudan derleyip resmi dağıtım imajıyla digest'in (hash) aynı olup olmadığını karşılaştırarak, yayımlanan imajın değiştirilmediği herkes tarafından bağımsız biçimde doğrulanabilir: bu, tedarik zinciri güvenliği açısından önemlidir
- Arch Linux'un Docker imajları artık bit-for-bit yeniden üretilebilir biçimde sunuluyor ve birkaç ay önce WSL imajında ulaşılan aynı kilometre taşı Docker tarafına da genişletiliyor
- Bu imaj, özel
reproetiketi ile dağıtılıyor; yeniden üretilebilirliği garanti etmek için pacman anahtarlarının imajdan kaldırılması gerektiğindenpacmandoğrudan kullanılamıyor- Uygun bir çözüm bulunana kadar bu kısıt nedeniyle şimdilik ayrı bir etiketle sunuluyor
- Konteyner içinde paket kurmak veya güncellemek için önce
pacman-key --init && pacman-key --populate archlinuxkomutunu çalıştırarak keyring'i yeniden oluşturmak gerekiyor- İlk çalıştırmada etkileşimli olarak ilerleyebilir veya bu imajı temel alan bir Dockerfile içindeki
RUNifadesinde çalıştırabilirsiniz - Distrobox'ta bu işlem,
distrobox create -n arch-repro -i docker.io/archlinux/archlinux:repro --pre-init-hooks "pacman-key --init && pacman-key --populate archlinux"örneğinde olduğu gibi bir pre-init hook ile yapılabilir
- İlk çalıştırmada etkileşimli olarak ilerleyebilir veya bu imajı temel alan bir Dockerfile içindeki
- İmajın bit-for-bit yeniden üretilebilirliği, derlemeler arasında digest eşleşmesi ile doğrulanıyor; bunun için
podman inspect --format '{{.Digest}}' <image>vediffocikarşılaştırması kullanılıyor - Bu Docker imajının nasıl yeniden üretileceği
REPRO.mdiçinde görülebilir
Uygulama ve yapılan ayarlamalar
- Docker imajı için temel rootFS'yi deterministik biçimde derlemek en büyük zorluktu; rootFS derleme sistemini paylaşan WSL imajıyla aynı süreç yeniden kullanıldı
- İlgili WSL commit'ine buradan bakılabilir
- Docker'a özel ayarlamalardan biri olarak
SOURCE_DATE_EPOCHtanımlandı ve Dockerfile içindekiorg.opencontainers.image.createdLABEL'ı da buna uyacak şekilde düzenlendi - Derlenen imajda deterministik olmamaya yol açan
ldconfigyardımcı önbellek dosyasıvar/cache/ldconfig/aux-cache, Dockerfile aşamasında kaldırıldı docker buildveyapodman buildsırasında--source-date-epoch=$SOURCE_DATE_EPOCHve--rewrite-timestampseçenekleri kullanılarak zaman damgası normalizasyonu uygulandı- Örnek olarak
etc/,etc/ld.so.cache,etc/os-release,sys/,var/cache/,var/cache/ldconfig/,proc/,dev/zamanlarının birbirinden farklı yazılması sorunu gösteriliyor
- Örnek olarak
- İlgili değişikliklerin tamamı,
archlinux-dockerdeposundaki merge request diff içinde daha ayrıntılı görülebilir - Sonraki adım olarak Docker imajı, WSL imajı ve gelecekteki yeniden üretilebilir imajlar için sunucuda bir rebuilder kurularak düzenli otomatik yeniden derleme, yeniden üretilebilirlik doğrulaması ve derleme günlükleri ile sonuçların yayımlanması planlanıyor
1 yorum
Hacker News yorumları
Bu tür bir özgüven görmek güzel
Yaklaşık 1 yıldır WSL 2 üzerinde Arch Linux kullandım ve çok iyiydi, ardından yaklaşık 5 ay yerel Arch kullandım ve ondan da memnun kaldım
Hâlâ yerel Arch kullanıyorum ve dotfiles yapılandırmamı temiz bir dosya sistemi üzerinde Arch Docker image ile test ediyorum
Tam bir masaüstü ortamını kuran uçtan uca testlere ihtiyaç duyduğumda VM üzerinde Arch çalıştırıyorum
Hayatımda bolca sorun var ama en azından Arch bunlardan biri değil
Prometheus metrikleri ve health probe desteği olan kurumsal seviye bir dotfiles kurulumu arıyordum, tam öyle bir hava veriyor
Şimdiye kadar buna ihtiyacım olduğunu hiç düşünmemiştim ama görür görmez lazım oldu
Denediysen onlara dair görüşlerini de duymak isterim
Bence tüm Docker konteynerleri baştan beri böyle olmalıydı
docker buildaşamasındaapt-get updateçalıştırmak neredeyse bir antipatternBen kullandım ve oldukça iyi çalıştı
Güncelleme yapmazsan konteynerde bilinen güvenlik sorunları birikiyor, güncelleme yaparsan da yeniden üretilebilirlik bozuluyor
Yeniden üretilebilirlik kesinlikle havalı ve güvenlik açısından da avantajları var ama konteyner bir ayı geçince artık hedef dışı gibi hissettirebiliyor; belki de uygun azami ömür gün bazında, hatta bir gün seviyesinde olmalı
Etiketlenmiş kaynak kodu indirip her şeyi gcc ile elle derlememiz mi kastediliyor diye merak ediyorum
Yeniden üretilebilir konteynerler güzel ama her zaman gerekli değil; konteyner içinde
apt-getçalıştırıp yeniden üretilebilirliği umursamamanın da gayet makul olduğu pek çok durum varTabii archive'dan çekmenin yolları var
Yeniden üretilebilir image'lar çoğu zaman günlük hayatta sadece duygusal tatmin sağlayan bir özellik gibi görünüyor ama bir gün gerçekten lazım oluyor
Bizde de aynı olması gereken iki image, farklı makinelerde zaman damgasında 3 baytlık bir fark üretmişti; bu yüzden tamamen yanlış yönde bisect yaparak bir öğleden sonrayı çöpe attık
Gösterişli değildi ama kesinlikle değerli bir kazanımdı
Sanırım CI/CD pipeline'ında Arch kullandığını herkese duyuracak bir şey ekleyebilirsin
Crossfit yaptığını da söylemiş olursun tabii
Vegan bir crossfitter ve Arch kullanıcısıyla karşılaşırsan, sana ilk önce hangisini söyler
Reproducible Builds hakkında bilgi burada var
https://reproducible-builds.org/
Yakından ilişkili Bootstrappable Builds topluluğu da burada
https://bootstrappable.org/
Arch ya da Alpine gibi iyi tasarlanmış mutable işletim sistemleri uzun vadede NixOS benzeri sistemleri geçebilir mi diye merak ediyorum
Çünkü kurulum script'leri, deklaratif yapılandırma dillerine göre daha ifade gücü yüksek ve çoğu zaman daha az ayrıntılı oluyor
Deklaratif bir yapılandırma dili de var, aynı zamanda Turing-complete ve kullanımı rahat bir programlama dili de sunuyor
Yazıyı okudum ve oldukça havalı görünüyor ama sanki Dockerfile ile docker image kavramlarını biraz birbirine karıştırıyor
Dockerfile yerine nix benzeri bir şeyle image tar dosyasını doğrudan oluştursalardı daha kolay olurdu diye düşünüyorum; evet biraz daha niş olurdu ama daha temiz de olurdu
Küçük bir düzeltme ama bence OCI Image terimini kullanmak daha doğru
podman ile de sorunsuz çalışıyor
Bunu gerçekten mümkün kılan insanlara büyük saygı duyuyorum
Böyle bir başlığı gerçeğe dönüştürmek için gereken zaman ve emek tahmin edilenden çok daha fazla
Tamamen ayrı bir konu ama o sayfada bir animasyon var ve yaklaşık 1 saniye boyunca sayfadaki neredeyse tüm öğeler aşağı doğru yaklaşık 20 piksel kayıyor
Gözümün önünde düzen sallandığı için doğal olarak CLS'yi mahvedeceğini düşündüm ama gerçek CLS 0 çıktı
Bu da bana CLS'nin yanıltıcı bir metrik olup olmadığını düşündürdü
CLS, ilk render sırasındaki değişimleri ele alır; dolayısıyla layout shift gibi görünse de CLS'ye dahil edilen türden bir durum değil
CSS transition kaynaklı bir hareket, yani beklenen bir değişim; bu yüzden layout shift olarak sayılmıyor