Karn Tirasoontorn

July 26, 2021

multi-stage ช่วยลดขนาดของ Docker Image ได้

เมื่อการติดตั้งโปรแกรมสำหรับ production ด้วย docker กลายเป็นสิ่งที่หลีกเลี่ยงไม่ได้ เนื่องด้วยแวดล้อมในการติดตั้งไม่ว่าจะต่อ internet ไม่ได้บ้าง ความต้องการของผู้ดูแลเรื่องระบบเครือข่ายบ้าง ทำให้ docker น่าจะเป็นทางออกที่ดี

การสร้าง dockerfile ในช่วงแรกๆ เรียกได้ว่า copy จากคนอื่นมาล้วนๆ เพื่อให้โปรแกรมสามารถใช้งานก่อน จากนั้นจึงค่อยๆ เรียนรู้ไป จนได้เริ่มมาได้ยินเรื่อง multi-stage ที่น่าจะช่วย optimize เรื่องขนาดของ image ให้เล็กลงได้

Few weeks later!!! ทั้งศึกษา งมแก้แบบมั่วบ้าง เข้าใจบ้าง จนท้ายที่สุดก็ได้ docker image ที่น่าพอใจ (ในตอนนี้) โดยได้นำไปทดลองใช้กับ 2 โปรเจค 
  1. โปรเจค Ruby on Rails ขนาดเล็ก ที่ใช้เก็บข้อมูลสินค้า มีแค่ฟอร์มบันทึก แก้ไขข้อมูล และแสดงผลง่ายๆ เท่านั้น
  2. โปรเจค Ruby on Rails ที่ค่อนข้างใหญ่หน่อย มีการติดตั้งโปรแกรมสำหรับจัดการรูปภาพ โปรแกรมแปลงไฟล์ HTML  ให้เป็น PDF  ซึ่งมีไลบราลีที่เป็นเกี่ยวเนื่องกันอยู่พอสมควร

Images ก่อนทำ multi-stage

REPOSITORY        TAG                 IMAGE ID       CREATED          SIZE
simple_app        1.0                 5c0a32ed097d   8 hours ago      1.4GB
thip              3.1.1-beta-3        02400db6d8be   26 seconds ago   1.44GB

Images หลังทำ multi-stage

REPOSITORY        TAG                 IMAGE ID       CREATED          SIZE
simple_app        1.1                 02f892cafb39   8 hours ago      868MB
thip              3.1.1-beta-4        f0cf614927f5   19 minutes ago   1.18GB

สรุปผลกันหน่อย
จะเห็นได้ว่าในส่วนของโปรเจคแรกขนาดของ Image ลดลงได้ 37.85% 😲😲😲😲 และโปรเจคที่สองขนาดของ Image ลดลงได้ 18.05% 😲😲 สาเหตุที่ทำให้ขนาดของ Image ตัวนี้ลดลงได้ไม่มากนักก็น่าจะเป็นเพราะมีการติดตั้งโปรแกรม และไลบราลีต่างๆ ตามที่ได้กล่าวไว้ข้างต้น

ส่วนมาก image ของเราที่ใหญ่มาจากไลบราลีที่ใช้ในการคอมไพล์โปรแกรม หรือโปรแกรมที่จำเป็นต้องใช้งานขณะ runtime จะพูดให้ง่ายๆ ก็คือการทำ multi-stage เหมือนสร้าง image ตัวหนึ่งไว้สำหรับการคอมไพล์โปรแกรม และสร้างอีก image หนึ่งขึ้นมาเพื่อใช้สำหรับเก็บโปรแกรมที่พร้อมใช้งานจริง และมีไลบราลีที่เกี่ยวข้องที่จำเป็นเท่านั้น นั้นจึงทำให้ขนาดของ image ลดลงได้