- Image Docker Arch Linux dengan reproducibility bit-for-bit kini tersedia, memperluas tonggak yang sama yang dicapai pada image WSL beberapa bulan lalu ke Docker
- Image didistribusikan dengan tag repro khusus, dan untuk menjamin reproducibility, kunci pacman dihapus sehingga
pacman tidak bisa langsung digunakan dalam keadaan default
- Untuk memasang atau memperbarui paket di dalam container, diperlukan pembuatan ulang keyring, yang dapat diinisialisasi dengan
pacman-key --init && pacman-key --populate archlinux
- Reproducibility diverifikasi melalui kecocokan digest antar-build dan perbandingan dengan
diffoci, bersama penyesuaian seperti build rootFS yang deterministik, normalisasi timestamp, dan penghapusan cache bantuan ldconfig
- Prosedur reproduksi dapat dilihat di
REPRO.md, dan ke depannya ini bisa berlanjut ke rebuild serta verifikasi otomatis melalui server rebuilder, termasuk publikasi log build dan hasilnya
Poin utama
- Image Docker Arch Linux kini tersedia dalam bentuk dapat direproduksi bit-for-bit, memperluas tonggak yang sama yang dicapai pada image WSL beberapa bulan lalu ke sisi Docker
- Image ini didistribusikan dengan
tag repro khusus, dan untuk menjamin reproducibility, kunci pacman harus dihapus dari image sehingga pacman tidak bisa langsung digunakan
- Sampai solusi yang tepat tersedia, pembatasan ini membuatnya sementara disediakan terlebih dahulu sebagai tag terpisah
- Untuk memasang atau memperbarui paket di dalam container, Anda harus lebih dulu menjalankan
pacman-key --init && pacman-key --populate archlinux untuk membuat ulang keyring
- Pada eksekusi pertama, ini bisa dijalankan secara interaktif, atau dijalankan dalam pernyataan
RUN pada Dockerfile yang menggunakan image ini sebagai basis
- Di Distrobox, ini bisa ditangani melalui pre-init hook seperti
distrobox create -n arch-repro -i docker.io/archlinux/archlinux:repro --pre-init-hooks "pacman-key --init && pacman-key --populate archlinux"
- Reproducibility bit-for-bit dari image ini dikonfirmasi melalui kecocokan digest antar-build, dan diverifikasi dengan
podman inspect --format '{{.Digest}}' <image> serta perbandingan menggunakan diffoci
- Cara mereproduksi image Docker ini dapat dilihat di
REPRO.md
Implementasi dan penyesuaian
- Tantangan terbesar adalah membangun rootFS dasar untuk image Docker secara deterministik, dan proses yang sama dengan image WSL yang berbagi sistem build rootFS digunakan kembali
- Commit WSL terkait dapat dilihat di sini
- Salah satu penyesuaian khusus Docker adalah menetapkan
SOURCE_DATE_EPOCH dan menyesuaikan LABEL org.opencontainers.image.created pada Dockerfile agar mengikutinya
- File cache bantuan
ldconfig var/cache/ldconfig/aux-cache, yang memicu non-determinisme pada image hasil build, dihapus pada tahap Dockerfile
- Saat
docker build atau podman build, opsi --source-date-epoch=$SOURCE_DATE_EPOCH dan --rewrite-timestamp digunakan untuk menerapkan normalisasi timestamp
- Sebagai contoh, ditunjukkan adanya masalah ketika waktu pada
etc/, etc/ld.so.cache, etc/os-release, sys/, var/cache/, var/cache/ldconfig/, proc/, dev/ tercatat berbeda-beda
- Seluruh perubahan terkait dapat dilihat lebih detail di merge request diff repositori
archlinux-docker
- Langkah berikutnya mencakup kemungkinan membangun rebuilder di server untuk image Docker, image WSL, dan image reproducible berikutnya, guna rebuild otomatis berkala, verifikasi reproducibility, serta publikasi log build dan hasil
1 komentar
Komentar Hacker News
Menyenangkan melihat rasa percaya diri seperti ini
Saya menjalankan Arch Linux di WSL 2 selama hampir 1 tahun dan hasilnya sangat bagus, lalu memakai Arch native sekitar 5 bulan dan tetap puas
Sampai sekarang saya masih memakai Arch native, dan dotfiles saya diuji dengan image Docker Arch di filesystem yang bersih
Saat butuh pengujian end-to-end sampai penyiapan lingkungan desktop penuh, saya menjalankan Arch di VM
Saya sendiri punya banyak masalah, tapi setidaknya Arch bukan salah satunya
Saya sedang mencari penyiapan dotfiles kelas enterprise yang bahkan mendukung metrik Prometheus dan health probe, dan ini terdengar persis seperti itu
Saya bahkan tidak pernah merasa membutuhkannya, tapi begitu melihat ini saya langsung merasa butuh
Kalau pernah, saya ingin tahu juga bagaimana kesan Anda
Menurut saya semua kontainer Docker seharusnya memang seperti ini sejak awal
Menjalankan
apt-get updatepada tahap docker build itu nyaris seperti antipolaSaya pernah memakainya sendiri dan hasilnya bekerja cukup baik
Kalau tidak update, isu keamanan yang sudah diketahui akan menumpuk di kontainer; kalau update, reproducibility-nya rusak
Reproducibility memang keren dan punya manfaat keamanan, tapi setelah kontainer berumur lebih dari sebulan itu bisa terasa seperti target yang meleset, dan mungkin umur maksimum yang lebih masuk akal justru hitungan hari
Apakah maksudnya kita harus mengambil source code yang sudah ditag lalu mengompilasi semuanya sendiri dengan gcc?
Kontainer yang reproducible memang bagus, tapi tidak selalu dibutuhkan, dan ada banyak kasus di mana menjalankan
apt-getdi dalam kontainer tanpa terlalu peduli pada reproducibility tetap sepenuhnya masuk akalTentu saja masih ada cara mengambilnya dari archive
Image yang reproducible sering terasa seperti fitur yang cuma memberi kepuasan emosional sehari-hari, tapi akan ada saat ketika itu benar-benar dibutuhkan
Kami pernah punya dua image yang seharusnya identik tetapi di mesin berbeda menghasilkan perbedaan 3 byte pada timestamp, dan gara-gara itu kami membuang satu sore penuh untuk melakukan bisect ke arah yang sama sekali salah
Tidak mencolok, tapi jelas kemenangan yang sangat berharga
Sepertinya ada sesuatu yang bisa disisipkan untuk memberi tahu semua orang bahwa Anda memakai Arch di pipeline CI/CD
Sekalian juga memberi tahu bahwa Anda ikut Crossfit tentunya
Jika Anda bertemu vegan crossfitter yang juga pengguna Arch, apa hal pertama yang akan dia beri tahu kepada Anda?
Informasi tentang Reproducible Builds bisa dilihat di sini
https://reproducible-builds.org/
Komunitas Bootstrappable Builds yang sangat terkait ada di sini
https://bootstrappable.org/
Saya penasaran apakah sistem operasi mutable yang dirancang dengan baik seperti Arch atau Alpine pada akhirnya bisa mengalahkan sistem seperti NixOS dalam jangka panjang
Alasannya, skrip instalasi lebih ekspresif daripada bahasa konfigurasi deklaratif, dan biasanya juga tidak lebih bertele-tele
Anda mendapat bahasa konfigurasi deklaratif, sekaligus bahasa pemrograman yang Turing-complete dan enak dipakai
Saya sudah membaca artikelnya dan terlihat cukup keren, tapi rasanya mereka mencampuradukkan Dockerfile dan docker image
Kalau mereka membangun file tar image langsung dengan sesuatu seperti nix alih-alih Dockerfile, mungkin malah akan lebih mudah; memang agak niche, tapi tetap terasa lebih rapi
Sedikit catatan kecil, tapi menurut saya istilah OCI Image lebih tepat dipakai
Di podman juga berjalan tanpa masalah
Hormat sebesar-besarnya untuk orang-orang yang benar-benar mewujudkan ini
Waktu dan usaha yang dibutuhkan untuk menghasilkan satu headline seperti ini jauh lebih besar daripada yang dibayangkan kebanyakan orang
Ini benar-benar topik lain, tapi di halaman itu ada sebuah animasi yang membuat hampir semua elemen halaman bergerak turun sekitar 20 piksel selama 1 detik
Melihat layout berguncang di depan mata, saya kira itu pasti menghancurkan CLS, tetapi CLS aktualnya 0
Jadi saya jadi bertanya-tanya apakah CLS itu metrik yang menyesatkan
CLS menangani perubahan pada saat rendering awal, jadi meskipun tampak seperti pergeseran layout, itu bukan jenis yang dihitung sebagai CLS
Gerakan karena CSS transition adalah perubahan yang dapat diperkirakan, jadi tidak dihitung sebagai layout shift