- อิมเมจ Docker ของ Arch Linux ที่มี ความสามารถในการทำซ้ำได้แบบ bit-for-bit พร้อมใช้งานแล้ว โดยขยายหมุดหมายเดียวกันที่ทำได้กับอิมเมจ WSL เมื่อไม่กี่เดือนก่อนมาสู่ Docker
- อิมเมจถูกเผยแพร่ด้วย แท็ก repro โดยเฉพาะ และเพื่อรับประกันความสามารถในการทำซ้ำได้จึงมีการลบคีย์ pacman ออก ทำให้ในสถานะเริ่มต้นไม่สามารถใช้
pacmanได้ทันที - หากต้องการติดตั้งหรืออัปเดตแพ็กเกจภายในคอนเทนเนอร์ จำเป็นต้อง สร้าง keyring ใหม่ และสามารถเริ่มต้นได้ด้วย
pacman-key --init && pacman-key --populate archlinux - ความสามารถในการทำซ้ำได้ตรวจสอบด้วย digest ที่ตรงกัน ระหว่างการบิลด์และการเปรียบเทียบด้วย
diffociพร้อมมีการปรับแต่งอย่างการบิลด์ rootFS แบบกำหนดได้แน่นอน การทำให้ timestamp เป็นมาตรฐาน และการลบแคชเสริมของldconfig - ขั้นตอนการทำซ้ำสามารถดูได้ใน
REPRO.mdและในอนาคตอาจต่อยอดไปสู่การรีบิลด์และตรวจสอบอัตโนมัติผ่าน เซิร์ฟเวอร์ rebuilder รวมถึงการเปิดเผยบันทึกการบิลด์และผลลัพธ์
เนื้อหาสำคัญ
- ตอนนี้ อิมเมจ Docker ของ Arch Linux ถูกแจกจ่ายในรูปแบบที่ ทำซ้ำได้แบบ bit-for-bit แล้ว โดยเป็นการขยายหมุดหมายเดียวกันที่ทำได้กับอิมเมจ WSL เมื่อไม่กี่เดือนก่อนมายังฝั่ง Docker
- อิมเมจนี้เผยแพร่ผ่าน
reprotag โดยเฉพาะ และเพื่อรับประกันความสามารถในการทำซ้ำได้จำเป็นต้องลบ คีย์ pacman ออกจากอิมเมจ จึงไม่สามารถใช้pacmanได้ทันที- ข้อจำกัดนี้ทำให้ในช่วงนี้ยังต้องเผยแพร่เป็นแท็กแยกไปก่อน จนกว่าจะมีวิธีแก้ที่เหมาะสม
- หากต้องการติดตั้งหรืออัปเดตแพ็กเกจภายในคอนเทนเนอร์ ต้องรัน
pacman-key --init && pacman-key --populate archlinuxก่อนเพื่อ สร้าง keyring ใหม่- ในการรันครั้งแรกอาจทำแบบโต้ตอบได้ หรือจะรันในคำสั่ง
RUNของ Dockerfile ที่ใช้อิมเมจนี้เป็นเบสก็ได้ - ใน Distrobox สามารถจัดการผ่าน pre-init hook ได้ เช่น
distrobox create -n arch-repro -i docker.io/archlinux/archlinux:repro --pre-init-hooks "pacman-key --init && pacman-key --populate archlinux"
- ในการรันครั้งแรกอาจทำแบบโต้ตอบได้ หรือจะรันในคำสั่ง
- ความสามารถในการทำซ้ำแบบ bit-for-bit ของอิมเมจนี้ยืนยันได้จาก digest ที่ตรงกัน ระหว่างการบิลด์ และตรวจสอบด้วย
podman inspect --format '{{.Digest}}' <image>ร่วมกับการเปรียบเทียบด้วยdiffoci - วิธีทำซ้ำอิมเมจ Docker นี้ดูได้จาก
REPRO.md
การติดตั้งใช้งานและการปรับแต่ง
- งานที่ท้าทายที่สุดคือการบิลด์ rootFS พื้นฐานสำหรับอิมเมจ Docker แบบกำหนดได้แน่นอน และได้นำ กระบวนการเดียวกัน ที่ใช้กับอิมเมจ WSL ซึ่งแชร์ระบบบิลด์ rootFS ร่วมกันมาใช้ซ้ำ
- สามารถดูคอมมิตของ WSL ที่เกี่ยวข้องได้ที่ นี่
- หนึ่งในการปรับแต่งเฉพาะสำหรับ Docker คือการตั้งค่า
SOURCE_DATE_EPOCHและทำให้ LABELorg.opencontainers.image.createdใน Dockerfile สอดคล้องกับค่านี้ด้วย - มีการลบไฟล์แคชเสริม
ldconfigที่ก่อให้เกิด ความไม่เป็นกำหนดแน่นอน ในอิมเมจที่บิลด์แล้ว คือvar/cache/ldconfig/aux-cacheออกจากขั้นตอน Dockerfile - ระหว่าง
docker buildหรือpodman buildมีการใช้ตัวเลือก--source-date-epoch=$SOURCE_DATE_EPOCHและ--rewrite-timestampเพื่อ ทำให้ timestamp เป็นมาตรฐาน- มีการยกตัวอย่างปัญหาที่เวลาใน
etc/,etc/ld.so.cache,etc/os-release,sys/,var/cache/,var/cache/ldconfig/,proc/,dev/ถูกประทับไม่ตรงกัน
- มีการยกตัวอย่างปัญหาที่เวลาใน
- ดูรายละเอียดการเปลี่ยนแปลงทั้งหมดเพิ่มเติมได้จาก merge request diff ของรีโพซิทอรี
archlinux-docker - ขั้นถัดไปที่กำลังพิจารณาคือการตั้ง rebuilder บนเซิร์ฟเวอร์สำหรับอิมเมจ Docker, อิมเมจ WSL และอิมเมจที่ทำซ้ำได้อื่น ๆ ในอนาคต เพื่อรีบิลด์อัตโนมัติเป็นระยะ ตรวจสอบความสามารถในการทำซ้ำได้ และเปิดเผยบันทึกการบิลด์พร้อมผลลัพธ์
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ชอบที่มี ความมั่นใจ แบบนี้
ผมรัน Arch Linux บน WSL 2 อยู่เกือบ 1 ปีแล้วและมันดีมาก จากนั้นก็ใช้ Arch แบบเนทีฟต่ออีกราว 5 เดือนและก็ยังประทับใจเหมือนเดิม
ตอนนี้ก็ยังใช้ Arch แบบเนทีฟอยู่ และทดสอบ dotfiles บน Arch Docker image ด้วยไฟล์ซิสเต็มที่สะอาด
ถ้าต้องการทดสอบแบบ end-to-end ที่รวมถึงการตั้งค่าสภาพแวดล้อมเดสก์ท็อปเต็มรูปแบบ ก็จะรัน Arch ใน VM
ผมเองก็มีปัญหาเยอะนะ แต่อย่างน้อย Arch เองไม่ใช่หนึ่งในนั้น
ผมกำลังมองหาการตั้งค่า dotfiles ระดับองค์กรที่รองรับทั้ง Prometheus metrics และ health probe อยู่พอดี ฟังดูได้อารมณ์นั้นเลย
ก่อนหน้านี้ไม่เคยคิดเลยว่าตัวเองต้องการสิ่งนี้ แต่พอเห็นแล้วก็รู้สึกว่าจำเป็นขึ้นมาทันที
ถ้าเคย อยากฟังเหมือนกันว่ารู้สึกยังไง
ผมว่าคอนเทนเนอร์ Docker ทุกตัวเดิมทีก็ควรเป็น แบบนี้
การรัน
apt-get updateในขั้นตอน docker build นี่แทบจะเป็น anti-pattern เลยผมเคยใช้เองแล้ว มันทำงานได้ค่อนข้างดี
ถ้าไม่อัปเดต ก็จะสะสม ปัญหาความปลอดภัย ที่รู้กันอยู่ในคอนเทนเนอร์ แต่ถ้าอัปเดต ความสามารถในการทำซ้ำได้ ก็พัง
ความสามารถในการทำซ้ำได้นั้นเท่มากและมีข้อดีด้านความปลอดภัยด้วยจริง แต่พอคอนเทนเนอร์อายุเกินเดือน มันก็อาจเริ่มดูไม่ใช่เป้าหมายแล้ว และอายุสูงสุดที่เหมาะสมอาจอยู่ระดับเป็นวันมากกว่า
หมายถึงให้ไปดึงซอร์สโค้ดที่ติดแท็กไว้แล้วคอมไพล์ทุกอย่างเองด้วย gcc หรือเปล่า
คอนเทนเนอร์ที่ทำซ้ำได้ เป็นเรื่องดี แต่ไม่ได้จำเป็นเสมอไป และก็มีหลายกรณีที่รัน
apt-getในคอนเทนเนอร์แล้วไม่ต้องสนใจเรื่องความสามารถในการทำซ้ำได้ก็ได้แน่นอนว่าก็ยังพอมีวิธีดึงจาก archive ได้อยู่
ปกติแล้ว อิมเมจที่ทำซ้ำได้ มักให้ความพึงพอใจทางใจมากกว่าจะเป็นฟีเจอร์ที่จำเป็น แต่จะมีวันที่มันจำเป็นจริง ๆ
ฝั่งเราก็เคยมีอิมเมจสองตัวที่ควรจะเหมือนกันทุกอย่าง แต่กลับมี 3 ไบต์ ต่างกันใน timestamp บนคนละเครื่อง แล้วนั่นทำให้เราเสียเวลาทั้งบ่ายไปกับการ bisect ในทิศทางที่ผิด
มันไม่ใช่ชัยชนะที่หวือหวา แต่มีคุณค่าจริง ๆ
น่าจะหาทางแทรกอะไรบางอย่างเพื่อบอกทุกคนได้ว่าใช้ Arch ใน CI/CD pipeline
ก็คงเหมือนกับบอกคนอื่นว่าตัวเองเล่น Crossfit นั่นแหละ
ถ้าคุณเจอคนที่เป็นทั้งวีแกน เล่นครอสฟิต และเป็นผู้ใช้ Arch คนคนนั้นจะบอกคุณเรื่องอะไรก่อน
ดูข้อมูลเกี่ยวกับ Reproducible Builds ได้ที่นี่
https://reproducible-builds.org/
ส่วนชุมชน Bootstrappable Builds ที่เกี่ยวข้องกันอย่างใกล้ชิดอยู่ที่นี่
https://bootstrappable.org/
ผมสงสัยว่าในระยะยาว ระบบปฏิบัติการแบบ mutable ที่ออกแบบมาดีอย่าง Arch หรือ Alpine อาจชนะระบบแบบ NixOS ได้ไหม
เพราะสคริปต์ติดตั้งมีพลังในการแสดงออกมากกว่าภาษาคอนฟิกแบบประกาศ และโดยทั่วไปก็ไม่ได้ยืดยาวกว่าเสียด้วย
จะได้ทั้งภาษาคอนฟิกแบบประกาศ และในขณะเดียวกันก็ได้ภาษาโปรแกรมที่ Turing-complete และเขียนง่ายด้วย
ผมอ่านบทความแล้วและมันดูเจ๋งมาก แต่รู้สึกว่าเขาพูดปนกันระหว่าง Dockerfile กับ docker image
ถ้าสร้างไฟล์ tar ของอิมเมจโดยตรงด้วยอะไรอย่าง nix แทน Dockerfile น่าจะง่ายกว่า และถึงจะค่อนข้างเฉพาะทางแต่ก็น่าจะดูสะอาดกว่าด้วย
ขอทักนิดหนึ่งว่าใช้คำว่า OCI Image น่าจะถูกต้องกว่า
มันรันบน podman ได้ไม่มีปัญหาเลย
ขอคารวะอย่างมากต่อคนที่ทำให้สิ่งนี้เกิดขึ้นได้จริง
เวลาและความพยายามที่ต้องใช้เพื่อสร้างพาดหัวข่าวแบบนี้ขึ้นมาสักอัน น่าจะมากกว่าที่คนส่วนใหญ่จินตนาการ
เป็นอีกเรื่องหนึ่งไปเลย แต่ในหน้านั้นมี แอนิเมชัน อยู่ตัวหนึ่ง ทำให้องค์ประกอบเกือบทั้งหมดของหน้าขยับลงไปราว 20 พิกเซลเป็นเวลา 1 วินาที
พอเห็นเลย์เอาต์สั่นอยู่ตรงหน้า ก็คิดว่า CLS คงพังเละเทะแน่ ๆ แต่ค่า CLS จริงกลับเป็น 0
เลยทำให้สงสัยว่า CLS เป็น metric ที่ชวนให้เข้าใจผิดหรือเปล่า
CLS วัดการเปลี่ยนแปลงในช่วง initial rendering ดังนั้นถึงจะดูเหมือนเลย์เอาต์ขยับ แต่ก็ไม่ใช่ประเภทที่ถูกนับเป็น CLS
มันเป็นการเคลื่อนไหวจาก CSS transition ซึ่งเป็นการเปลี่ยนแปลงที่คาดเดาได้ จึงไม่ถูกนับเป็น layout shift