วันนี้ไปดู release note ของ Docker edge version (v17.05.0 ce) พบว่า
มีความสามารถที่กำลังต้องการคือ Multi-stage build
ซึ่งช่วยทำให้การสร้าง image ของระบบงานได้ง่าย และสะดวกขึ้น
ที่สำคัญยังช่วยลดขนาดของ image อีกด้วย
มาลองใช้งานกันดู
ก่อนอื่นมาดูขั้นตอนการสร้าง image แบบปกติกันก่อน
ระบบตัวอย่างเป็นการสร้าง image ของระบบที่พัฒนาด้วยภาษา Go ซึ่งส่วนใหญ่มักจะสร้าง image ขึ้นมาสองตัวคือ- สำหรับทำการ build เพื่อ compile และสร้างไฟล์ binary ของระบบ
- สำหรับการ deploy นั่นคือทำการทำเอาไฟล์ binary จาก image ตัวที่ 1
มาดูกันต่อสิว่าแล้ว Multi-stage build มันเป็นอย่างไร ?
จากวิธีการข้างต้น ต้องจัดการ Dockerfile 2 ไฟล์ ซึ่งดูลำบากน่าดู ดังนั้นจะดีไหม ถ้ายุบให้เหลือเพียงไฟล์เดียว น่าจะสบายขึ้นไหม ? จากวิธีการข้างต้น จะสร้าง image ขึ้นมา 2 ตัว ซึ่งต้องลบ image ตัวแรกออกไปตลอด ดังนั้นจะดีไหม ถ้าเราสร้างไฟล์ image เดียวไปเลย เราสามารถเขียน Dockerfile แบบใหม่ได้ดังนี้ [gist id="c6c98aae33c7d43126147b914e052a12" file="Dockerfile_multi"] คำอธิบาย- COPY --from=0 คือการบอกว่าให้ copy ข้อมูลจาก image แรก โดยเริ่มจากตำแหน่งที่ 0
- หรืออาจจะใช้ COPY --from=build ก็ได้นะครับ ทำให้อ่านเข้าใจง่ายขึ้นอีก
- จากตัวอย่างทำการ copy ไฟล์ app ซึ่งเป็นไฟล์ binary มายัง image ที่สอง