
Docker & Containerization
Dockerfile, multi-stage builds, การปรับแต่ง image, docker-compose, การจัดการ container
1เหตุผลหลักในการใช้ multi-stage build สำหรับแอปพลิเคชัน Go คืออะไร?
เหตุผลหลักในการใช้ multi-stage build สำหรับแอปพลิเคชัน Go คืออะไร?
คำตอบ
Multi-stage build แยกสภาพแวดล้อมการคอมไพล์ออกจาก image สุดท้าย โดย stage ของ build จะมี Go SDK ครบชุด (หลายร้อย MB) ขณะที่ image สุดท้ายมีเพียง binary ที่คอมไพล์แล้วเท่านั้น ซึ่งช่วยลดขนาด image ลงอย่างมาก (จากประมาณ 800MB เหลือไม่กี่ MB) และลดพื้นผิวการโจมตีด้วยการกำจัด build tools ที่ไม่จำเป็นในการใช้งานจริง
2ควรใช้ base image ใดสำหรับแอปพลิเคชัน Go ในการใช้งานจริงเพื่อลดขนาดและพื้นผิวการโจมตี?
ควรใช้ base image ใดสำหรับแอปพลิเคชัน Go ในการใช้งานจริงเพื่อลดขนาดและพื้นผิวการโจมตี?
คำตอบ
image scratch เป็น image ว่างเปล่าที่ไม่มีระบบปฏิบัติการ Go คอมไพล์เป็น binary แบบ static ที่ไม่ต้องใช้ libc หรือ dependency ของระบบอื่น ๆ จึงสามารถใช้ scratch ได้ ซึ่งสร้าง image ที่เล็กที่สุดเท่าที่จะเป็นไปได้ (ไม่กี่ MB) และให้ความปลอดภัยสูงสุดเพราะไม่มีเครื่องมือหรือ shell ที่สามารถถูกใช้โจมตีได้ Distroless และ alpine เป็นทางเลือกที่ใช้ได้แต่เหมาะสมน้อยกว่า
3ต้องใช้ flag การคอมไพล์ Go ใดบ้างเพื่อสร้าง binary ที่เข้ากันได้กับ image scratch?
ต้องใช้ flag การคอมไพล์ Go ใดบ้างเพื่อสร้าง binary ที่เข้ากันได้กับ image scratch?
คำตอบ
CGO_ENABLED=0 ปิดการใช้งาน cgo บังคับให้ Go ใช้การ implement แบบ pure Go สำหรับ package เช่น net และ os/user หากไม่มีสิ่งนี้ binary จะมี dependency แบบ dynamic ไปยัง libc ส่วน GOOS และ GOARCH ระบุแพลตฟอร์มเป้าหมาย flag เหล่านี้รวมกันจะสร้าง binary แบบ static อย่างสมบูรณ์โดยไม่มี dependency ภายนอก ซึ่งเหมาะอย่างยิ่งสำหรับ scratch
จะปรับแต่งการแคช layer ของ Docker เมื่อ build แอปพลิเคชัน Go ได้อย่างไร?
ข้อดีของการใช้ image Google Distroless สำหรับ Go เมื่อเทียบกับ scratch คืออะไร?
+17 คำถามสัมภาษณ์
หัวข้อสัมภาษณ์ Go อื่นๆ
พื้นฐาน Go
โครงสร้างข้อมูล Go
อินเทอร์เฟซใน Go
การจัดการข้อผิดพลาด
พื้นฐาน Goroutine
Channels
Go Modules
เซิร์ฟเวอร์ HTTP
ไคลเอนต์ HTTP
การเข้ารหัส JSON
Database/SQL
แพ็กเกจ context
Testing
รูปแบบ Concurrency
ไพรมิทีฟการซิงโครไนซ์
เฟรมเวิร์กเว็บ Go
การออกแบบ REST API
gRPC
Reflection
การจัดการหน่วยความจำ
การเพิ่มประสิทธิภาพการทำงาน
Generics
Go Design Patterns
Microservices
ความปลอดภัยและการยืนยันตัวตน
Kubernetes Basics
Go ขั้นสูง
การพัฒนา CLI
เชี่ยวชาญ Go สำหรับการสัมภาษณ์ครั้งถัดไป
เข้าถึงคำถามทั้งหมด flashcards แบบทดสอบเทคนิค แบบฝึกหัด code review และตัวจำลองสัมภาษณ์
เริ่มใช้ฟรี