ได้ คุณสามารถใช้อิมเมจพื้นฐานอื่นสำหรับแอปพลิเคชัน Go ของคุณใน Docker ได้ นี่คือตัวเลือกและข้อควรพิจารณาบางประการ:
1. รูปภาพ Golang อย่างเป็นทางการ:
- รูปภาพ `golang` อย่างเป็นทางการเป็นจุดเริ่มต้นที่ดีและแนะนำโดยทีมงาน Docker
- มีห่วงโซ่เครื่องมือ Go และการพึ่งพาที่จำเป็นในการสร้างและรันแอปพลิเคชัน Go ของคุณ
- ตัวอย่าง: `FROM golang:1.19-alpine`
2. รูปภาพบนเทือกเขาแอลป์:
- รูปภาพ `golang:alpine` เป็นรูปแบบที่เล็กกว่าของรูปภาพ `golang` อย่างเป็นทางการ โดยอิงตามการกระจาย Alpine Linux
- ส่งผลให้อิมเมจ Docker สุดท้ายมีขนาดเล็กลง ซึ่งเป็นประโยชน์สำหรับการปรับใช้
- อย่างไรก็ตาม รูปภาพที่ใช้อัลไพน์อาจมีปัญหาความเข้ากันได้กับไลบรารีบางอันที่ขึ้นอยู่กับ glibc
- ตัวอย่าง: `FROM golang:1.19-alpine`
3. รูปภาพที่ไม่มีการกระจาย:
- อิมเมจ Distroless เป็นอิมเมจ Docker ขั้นต่ำและไม่ใช่รูท ซึ่งมีเพียงแอปพลิเคชันของคุณและการอ้างอิงรันไทม์เท่านั้น
- ได้รับการออกแบบมาให้มีขนาดเล็กและปลอดภัยที่สุดเท่าที่จะเป็นไปได้ โดยไม่รวมตัวจัดการแพ็คเกจ เชลล์ หรือส่วนประกอบอื่น ๆ ที่ไม่จำเป็น
- ตัวอย่าง: `FROM gcr.io/distroless/base-debian11`
4. ภาพรอยขีดข่วน:
- รูปภาพ `scratch` เป็นอิมเมจพื้นฐานที่ว่างเปล่า ซึ่งหมายความว่าไม่มีระบบปฏิบัติการ ไลบรารี หรือการขึ้นต่อกันอื่นใด
- ผลลัพธ์ที่ได้คืออิมเมจ Docker ที่เล็กที่สุดเท่าที่จะเป็นไปได้ แต่แอปพลิเคชันของคุณต้องได้รับการคอมไพล์แบบคงที่และรวมการอ้างอิงที่จำเป็นทั้งหมด
- ตัวอย่าง: `ตั้งแต่เริ่มต้น`
เมื่อเลือกอิมเมจพื้นฐาน ให้พิจารณาปัจจัยต่อไปนี้:
- ขนาดภาพ: โดยทั่วไปแล้วควรใช้ภาพที่เล็กกว่าเพื่อการปรับใช้ที่รวดเร็วและลดความต้องการพื้นที่เก็บข้อมูล
- ความเข้ากันได้: ตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณและการขึ้นต่อกันของแอปพลิเคชันเข้ากันได้กับอิมเมจพื้นฐานที่คุณเลือก
- ความปลอดภัย: ภาพที่ไร้การกระจายและรอยขีดข่วนมีความปลอดภัยมากขึ้น เนื่องจากมีพื้นผิวการโจมตีที่เล็กกว่า
- การแก้ไขข้อบกพร่อง: รูปภาพที่มีระบบปฏิบัติการเต็มรูปแบบ (เช่น `golang`) อาจแก้ไขข้อบกพร่องได้ง่ายกว่า เนื่องจากคุณสามารถเข้าถึงเชลล์และยูทิลิตี้ของคอนเทนเนอร์ได้
การเลือกอิมเมจฐานในท้ายที่สุดจะขึ้นอยู่กับความต้องการเฉพาะของคุณ เช่น ขนาดรูปภาพ ความปลอดภัย และความซับซ้อนของแอปพลิเคชัน Go ของคุณ เป็นเรื่องปกติที่จะใช้อิมเมจ `golang` อย่างเป็นทางการสำหรับการพัฒนาและการทดสอบ จากนั้นจึงเปลี่ยนไปใช้อิมเมจแบบเรียบง่ายมากขึ้น เช่น `distroless` หรือ `scratch` สำหรับการใช้งานจริง
การอ้างอิง:[1] https://stackoverflow.com/questions/47028597/choosing-golang-docker-base-image
[2] https://hub.docker.com/_/golang
[3] https://snyk.io/blog/containerizing-go-applications-with-docker/
[4] https://docs.docker.com/language/golang/build-images/
[5] https://dev.to/chseki/build-a-super-minimalistic-docker-image-to-run-your-golang-app-33j0
-