[อ้างอิงถึงเทพนิยายเด็กอเมริกันเรื่อง "The Little Engine That Could" - ประมาณ เลน]*
วิธีสร้างอิมเมจ Docker ขนาดเล็กตามความต้องการของคุณโดยอัตโนมัติ
ความหลงใหลที่ไม่ธรรมดา
ในช่วงสองสามเดือนที่ผ่านมา ฉันหมกมุ่นอยู่กับว่าอิมเมจ Docker มีขนาดเล็กแค่ไหนและแอปพลิเคชันยังทำงานอยู่หรือไม่
ฉันเข้าใจความคิดนี้แปลก
ก่อนที่ฉันจะลงรายละเอียดและด้านเทคนิค ฉันอยากจะอธิบายว่าเหตุใดปัญหานี้จึงกวนใจฉันมาก และมันเกี่ยวข้องกับคุณอย่างไร
เหตุใดขนาดจึงมีความสำคัญ
ด้วยการลดเนื้อหาของอิมเมจ Docker เราจะลดรายการช่องโหว่ลง นอกจากนี้ เรายังทำให้รูปภาพสะอาดขึ้น เนื่องจากมีเฉพาะสิ่งที่จำเป็นในการเรียกใช้แอปพลิเคชันเท่านั้น
มีข้อดีอีกประการหนึ่งคือ - รูปภาพจะถูกดาวน์โหลดเร็วขึ้นเล็กน้อย แต่ในความคิดของฉันนี่ไม่สำคัญนัก
โปรดทราบ: หากคุณกังวลเกี่ยวกับขนาด สุนัขพันธุ์อัลไพน์จะดูเหมือนตัวเล็กและน่าจะเหมาะกับคุณ
ภาพที่ไม่มีการบิดเบือน
pip
и apt
จะไม่ทำงาน:
FROM gcr.io/distroless/python3
RUN pip3 install numpy
Dockerfile โดยใช้อิมเมจ Python 3 distroless
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM gcr.io/distroless/python3
---> 556d570d5c53
Step 2/2 : RUN pip3 install numpy
---> Running in dbfe5623f125
/bin/sh: 1: pip3: not found
ปิ๊งไม่อยู่ในรูป
โดยปกติแล้วปัญหานี้จะแก้ไขได้ด้วยการสร้างแบบหลายขั้นตอน:
FROM python:3 as builder
RUN pip3 install numpy
FROM gcr.io/distroless/python3
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/
การประกอบแบบหลายขั้นตอน
ผลลัพธ์ที่ได้คือรูปภาพขนาด 130MB ก็ไม่เลวนะ! สำหรับการเปรียบเทียบ: อิมเมจ Python เริ่มต้นมีน้ำหนัก 929MB และอิมเมจ "ทินเนอร์" (3,7-slim
) - 179MB ภาพอัลไพน์ (3,7-alpine
) คือ 98,6MB ในขณะที่อิมเมจ distroless พื้นฐานที่ใช้ในตัวอย่างคือ 50,9MB
เป็นเรื่องที่ยุติธรรมที่จะชี้ให้เห็นว่าในตัวอย่างก่อนหน้านี้ เรากำลังคัดลอกไดเร็กทอรีทั้งหมด /usr/local/lib/python3.7/site-packages
ซึ่งอาจมีการอ้างอิงที่เราไม่ต้องการ แม้ว่าจะชัดเจนว่าขนาดที่แตกต่างกันของอิมเมจพื้นฐาน Python ที่มีอยู่ทั้งหมดนั้นแตกต่างกันไป
ในขณะที่เขียน Google distroless ไม่รองรับอิมเมจจำนวนมาก: Java และ Python ยังอยู่ในขั้นทดลอง และ Python นั้นมีอยู่ในเวอร์ชัน 2,7 และ 3,5 เท่านั้น
ภาพเล็กๆ
กลับไปสู่ความหลงใหลในการสร้างสรรค์ภาพเล็กๆ น้อยๆ
โดยทั่วไป ฉันต้องการดูว่าภาพที่ปราศจาก distros ถูกสร้างขึ้นอย่างไร โปรเจ็กต์แบบไม่มี distroless ใช้เครื่องมือสร้างของ Google bazel
. อย่างไรก็ตาม การติดตั้ง Bazel และการเขียนภาพของคุณเองนั้นต้องทำงานหนักมาก (และพูดตามตรงว่า การสร้างวงล้อขึ้นมาใหม่นั้นสนุกและให้ความรู้) ฉันต้องการทำให้การสร้างภาพขนาดเล็กง่ายขึ้น: การสร้างภาพควรจะง่ายมาก ซ้ำซาก. เพื่อไม่ให้มีไฟล์การกำหนดค่าสำหรับคุณ มีเพียงบรรทัดเดียวในคอนโซล: просто собрать образ для <приложение>
.
ดังนั้น หากคุณต้องการสร้างภาพของคุณเอง โปรดทราบว่ามีภาพนักเทียบท่าที่ไม่เหมือนใคร scratch
. Scratch เป็นภาพที่ "ว่างเปล่า" ไม่มีไฟล์อยู่ในนั้น แม้ว่าตามค่าเริ่มต้นจะมีน้ำหนักก็ตาม - ว้าว! - 77 ไบต์
FROM scratch
ภาพรอยขีดข่วน
แนวคิดของอิมเมจเริ่มต้นคือคุณสามารถคัดลอกการขึ้นต่อกันใด ๆ จากเครื่องโฮสต์ลงในนั้นแล้วนำไปใช้ใน Dockerfile ได้ (ซึ่งเหมือนกับการคัดลอกไปที่ apt
และติดตั้งตั้งแต่ต้น) หรือใหม่กว่าเมื่ออิมเมจ Docker เกิดขึ้นจริง สิ่งนี้ช่วยให้คุณควบคุมเนื้อหาของคอนเทนเนอร์ Docker ได้อย่างสมบูรณ์และควบคุมขนาดของรูปภาพได้อย่างสมบูรณ์
ตอนนี้เราจำเป็นต้องรวบรวมการพึ่งพาเหล่านี้ เครื่องมือที่มีอยู่เช่น apt
อนุญาตให้คุณดาวน์โหลดแพ็คเกจ แต่จะเชื่อมโยงกับเครื่องปัจจุบันและไม่รองรับ Windows หรือ MacOS
ดังนั้นฉันจึงเริ่มสร้างเครื่องมือของตัวเองซึ่งจะสร้างอิมเมจพื้นฐานในขนาดที่เล็กที่สุดเท่าที่จะเป็นไปได้โดยอัตโนมัติและยังเรียกใช้แอปพลิเคชันใดๆ ได้ด้วย ฉันใช้แพ็คเกจ Ubuntu/Debian ทำการเลือก (รับแพ็คเกจโดยตรงจากที่เก็บข้อมูล) และพบการพึ่งพาซ้ำ ๆ โปรแกรมควรจะดาวน์โหลดแพ็คเกจเวอร์ชันเสถียรล่าสุดโดยอัตโนมัติ ซึ่งช่วยลดความเสี่ยงด้านความปลอดภัยให้มากที่สุด
ฉันตั้งชื่อเครื่องมือ fetchy
เพราะเขา... ค้นพบและนำ... สิ่งที่จำเป็น [จากอังกฤษ "ดึง", "นำมา" - ประมาณ เลน] เครื่องมือนี้ทำงานผ่านอินเทอร์เฟซบรรทัดคำสั่ง แต่ในขณะเดียวกันก็นำเสนอ API
ในการประกอบภาพโดยใช้ fetchy
(คราวนี้มาถ่ายรูป Python กัน) คุณเพียงแค่ต้องใช้ CLI ดังนี้: fetchy dockerize python
. คุณอาจถูกถามถึงระบบปฏิบัติการเป้าหมายและชื่อรหัสเพราะว่า fetchy
ปัจจุบันใช้แพ็คเกจที่ใช้ Debian และ Ubuntu เท่านั้น
ตอนนี้คุณสามารถเลือกการขึ้นต่อกันที่ไม่จำเป็นเลย (ในบริบทของเรา) และแยกออกได้ ตัวอย่างเช่น Python ขึ้นอยู่กับ Perl แม้ว่าจะทำงานได้ดีโดยไม่ต้องติดตั้ง Perl ก็ตาม
ผลการวิจัย
ภาพ Python สร้างขึ้นโดยใช้คำสั่ง fetchy dockerize python3.5
มีน้ำหนักเพียง 35MB (ฉันมั่นใจมากกว่าว่าในอนาคตจะทำให้เบากว่านี้ได้) ปรากฎว่าเราสามารถกำจัด WW อีก 15 WW ออกจากภาพที่ไม่มีการสลายได้
คุณสามารถดูภาพทั้งหมดที่รวบรวมไว้ได้
โครงการ -
หากคุณขาดคุณสมบัติ เพียงสร้างคำขอ เรายินดีที่จะช่วยเหลือ :) ยิ่งไปกว่านั้น ฉันกำลังดำเนินการบูรณาการตัวจัดการแพ็คเกจอื่นๆ เข้ากับ fetchy เพื่อไม่ให้จำเป็นต้องมีการสร้างหลายขั้นตอน
ที่มา: will.com