มาเลือก Node.js (docker image) ให้เหมาะสมกับโปรเจคของเรากันครับ
1. สำหรับ Development หรือ Build Stages:
ใช้ node:<version> หรือ bitnami/node:<version> เฉพาะในกรณีที่เราต้องคอมไพล์โมดูล Node.js ที่เป็น Native จาก C++ เช่นไลบรารี bcrypt, node-sqlite3, sharp เป็นต้น
สำหรับกรณีอื่นๆ ส่วนใหญ่ การเลือก node:<version>-slim ซึ่งมีขนาดเล็กกว่าและประสิทธิภาพดีกว่า จะเหมาะสมกว่า
.
2. สำหรับสภาพแวดล้อมการใช้งานจริง (Production Environments):
หากเรื่องช่องโหว่ความปลอดภัย (CVEs) และขนาดของ image ไม่ใช่สิ่งที่เราให้ความสำคัญสูงสุด การใช้ node:<version>-slim จะช่วยให้เราทำงานราบรื่น หากแอปพลิเคชันของเราต้องการแพ็กเกจ OS เพิ่มเติมหลายตัว การใช้ node:<version>-slim ก็ยังเป็นตัวเลือกที่เหมาะสมที่สุด
และสำหรับสภาพแวดล้อมที่ต้องการความปลอดภัยสูงหรืออยู่ภายใต้กฎระเบียบที่เข้มงวด:
เลือกใช้ gcr.io/distroless/nodejs ซึ่งเป็นตัวเลือกฟรี (แต่ควรระวังข้อจำกัดเกี่ยวกับ child_process.exec())
ใช้ cgr.dev/chainguard/node หากยอมรับเรื่องค่าใช้จ่ายหรือการใช้งานที่ต้องอ้างอิงเวอร์ชันล่าสุดเสมอ
.
3. สิ่งที่ควรหลีกเลี่ยง:
– หลีกเลี่ยงการใช้ node:latest นอกเหนือจากกรณีทดสอบหรือทดลอง
– หลีกเลี่ยง image อย่าง node:<version> ในงาน production เพราะมันมีขนาดใหญ่ เว้นแต่จำเป็นจริงๆ
– หลีกเลี่ยงการใช้ node:<version>-alpine หากเรายังไม่เข้าใจผลกระทบระหว่าง musl และ glibc (มีไลบรารีที่เราใช้มีปัญหากับ musl หรือไม่)
ลองไปอ่านเพิ่มเติมบทความเพิ่มเติมต้นทางได้ที่นี่นะครับ