บันทึกปัญหาที่เจอเกี่ยวการ build ระบบงานที่พัฒนาด้วย Java กับ Apache Maven
เพิ่มเติมความยากคือ เอาไป run ใน Docker อีก
ปัญหาที่เจอคือ เรื่องการ download dependency/library ใหม่
ในขั้นตอนการ build Docker image จาก Dockerfile
ซึ่งใช้เวลาในการ download นานมาก ๆ
ดังนั้นจึงมาหาวิธีการแก้ไขหน่อย
วิธีการที่ง่ายสุด ๆ คือ ทำการ download นอก Docker
จากนั้นทำการ copy JAR file เข้าไปใน Docker ดังนี้
[gist id="926416085a061754065bb34e28f9fe91" file="1.txt"]แต่วิธีไม่สามารถควบคุม JDK ที่ทำการ build JAR file ได้
จึงใช้งาน Docker multi-stage build เข้ามาช่วย
สามารถเขียน Dockerfile ใหม่ได้ดังนี้
- ขั้นตอนที่ 1 ทำการ build JAR file
- ขั้นตอนที่ 2 ทำการ copy JAR file มา เพื่อสร้าง image ที่มี JRE
ผลที่ตามมาคือ ช้ามาก ๆ เพราะว่า ต้องทำการ download ใหม่ทุกครั้ง
ยิงเป็น Spring Boot projectด้วยยิ่งช้าไปกันใหญ่
จึงต้องแก้ไขความช้านี้ก็หน่อย
มีวิธีการที่ทำได้ดังนี้
- ทำการ copy folder .m2 เข้าไปเลย ง่ายแต่ดูแปลก ๆ นะ
- ทำการเปลี่ยนไปใช้งาน Reverse proxy หรือ Local Package Server สำหรับ Apache Maven Dependency เลย
- ใช้ Docker buildkit
- Spring Boot Layer JAR
- Apache Maven Daemon
- Mount volume ของ Docker
แต่วิธีการที่ชอบ และ เหมาะกับที่ต้องการคือ การ Mount volume ของ Docker
และวิธีการที่ดีอีกคือ Spring Boot Layer JAR แต่ทำเยอะไปหน่อย
ตัวอย่างการใช้งาน Mount volume ของ Docker
[gist id="926416085a061754065bb34e28f9fe91" file="3.txt"]ผลที่ได้คือ ถ้าทำการ build ใหม่ด้วยการเพิ่ม dependency/library ไป
จะไม่ download ของเดิมอีกต่อไป จะ download ที่ของใหม่เท่านั้น
ถ้าใช้ร่วมกับ Local Package Server ก็จะรวดเร็วยิ่งขึ้น
Reference Websites