รูปภาพ Docker ตัวจิ๋วที่เชื่อมั่นในตัวเอง*

[อ้างอิงถึงเทพนิยายเด็กอเมริกันเรื่อง "The Little Engine That Could" - ประมาณ เลน]*

รูปภาพ Docker ตัวจิ๋วที่เชื่อมั่นในตัวเอง*

วิธีสร้างอิมเมจ Docker ขนาดเล็กตามความต้องการของคุณโดยอัตโนมัติ

ความหลงใหลที่ไม่ธรรมดา

ในช่วงสองสามเดือนที่ผ่านมา ฉันหมกมุ่นอยู่กับว่าอิมเมจ Docker มีขนาดเล็กแค่ไหนและแอปพลิเคชันยังทำงานอยู่หรือไม่

ฉันเข้าใจความคิดนี้แปลก

ก่อนที่ฉันจะลงรายละเอียดและด้านเทคนิค ฉันอยากจะอธิบายว่าเหตุใดปัญหานี้จึงกวนใจฉันมาก และมันเกี่ยวข้องกับคุณอย่างไร

เหตุใดขนาดจึงมีความสำคัญ

ด้วยการลดเนื้อหาของอิมเมจ Docker เราจะลดรายการช่องโหว่ลง นอกจากนี้ เรายังทำให้รูปภาพสะอาดขึ้น เนื่องจากมีเฉพาะสิ่งที่จำเป็นในการเรียกใช้แอปพลิเคชันเท่านั้น

มีข้อดีอีกประการหนึ่งคือ - รูปภาพจะถูกดาวน์โหลดเร็วขึ้นเล็กน้อย แต่ในความคิดของฉันนี่ไม่สำคัญนัก

โปรดทราบ: หากคุณกังวลเกี่ยวกับขนาด สุนัขพันธุ์อัลไพน์จะดูเหมือนตัวเล็กและน่าจะเหมาะกับคุณ

ภาพที่ไม่มีการบิดเบือน

โครงการ Distroless เสนอตัวเลือกอิมเมจ "distroless" พื้นฐานให้เลือก โดยไม่มีตัวจัดการแพ็คเกจ เชลล์ และยูทิลิตี้อื่น ๆ ที่คุณคุ้นเคยในบรรทัดคำสั่ง เป็นผลให้ใช้ตัวจัดการแพ็คเกจเช่น 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

ซื้อโฮสติ้งที่เชื่อถือได้สำหรับไซต์ที่มีการป้องกัน DDoS เซิร์ฟเวอร์ VPS VDS 🔥 ซื้อบริการเว็บโฮสติ้งที่เชื่อถือได้ พร้อมระบบป้องกัน DDoS และเซิร์ฟเวอร์ VPS/VDS | ProHoster