kiến thức Xây dựng Docker image tối ưu cho Spring Boot

Chắc cũng tùy dự án khác nhau, và việc build ngoài hay trong cũng chưa có tạo ra vấn đề lớn nên mỗi project có 1 cách làm khác nhau. Có một số dự án mình biết thì kể cả ở gitlabci / azure devops thì build jar cũng nằm trong docker container luôn cho dù mục đích là không phải là deploy và chạy trong docker container.

Cách họ build là vẫn copy code vào trong docker, build ra jar file rồi copy jar file trong container đó ra ngoài sau đó dùng làm mục đích khác.

Mục đích đó có thể là copy file jar vào docker để build image deploy như bài viết ở bên trên. Hoặc file jar đó cũng để lưu ở artifact repository, hoặc dùng làm library nếu không phải là runnable jar... etc.

Việc build ở bên trong container đảm bảo 1 việc là ở bất kỳ môi trường nào cũng có thể build được, không bị những lỗi lạ như permission hoặc biến môi trường của máy host, pipelines. Kết quả build jar ở trong 1 docker container sẽ có tính nhất quán cao, không có sự khác biệt giữa việc build ở các máy khác nhau chỉ cần có docker là được.:love:


Nếu như có 1 bước trước đó trong pipelines có được file jar đó thì mình nghĩ việc copy jar đó vào docker để build tiếp image deploy như chủ thớt là hợp lý. Hoặc có thể pipelines build image deploy không cần build jar file mà pull từ 1 private artifact repository về ...etc lúc này không cần source code để có được jar file.

Còn build cách nào trực tiếp trên môi trường pipelines bên ngoài docker hay bên trong docker là 1 chuyện khác, có thể project phức tạp không thể build bên trong docker nên người ta phải build bên ngoài, nhưng trước giờ may mà mình chưa gặp project dạng đó. Nếu build được bằng docker thì mình luôn sẽ build bên trong docker.

Sau này nếu pipeline agent có upgrade thay đổi version linux, hay có mang nó qua các pipelines khác gitlab, github, azure devops thì môi trường của những CI đó sẽ không làm ảnh hưởng gì đến kết quả build. Và trong pipelines cũng không đảm bảo có sẵn toàn bộ ngôn ngữ + version của java/python/golang/node ... etc nên build trong docker vẫn là lựa chọn số 1 của mình. Chỉ sợ sau này docker hub đóng cửa thôi :byebye:
Thời gian của cái job build đó chạy khoảng bao lâu là xong nhỉ? Nếu được bạn có thể share file gitlabci lên cho mọi người cùng tham khảo
 
Thời gian của cái job build đó chạy khoảng bao lâu là xong nhỉ? Nếu được bạn có thể share file gitlabci lên cho mọi người cùng tham khảo

Nhanh chậm tùy thuộc vào size của project thôi bác, nếu build trong docker mà được cache dependecies đầy đủ thì sẽ không chậm hơn build bên ngoài nhiều đâu. Project size nhỏ thì thậm chí chẳng cần cache làm gì

https://docs.gitlab.com/ee/ci/docker/docker_layer_caching.html
 
Last edited:
Đây là suy đoán của tôi, cao nhân nào sửa hộ nếu sai:
Việc copy thẳng file đã build vào docker là để chỉ tập trung tạo image docker nhanh deploy chỉ việc pull image và run nhiều instance dễ dàng.
Java bản thân nó chạy trên môi trường riêng JVM, JRE rồi nên chỉ cần đúng version là build ở win vứt vào linux vẫn chạy ok. Qua đó docker chỉ là để xác nhận chạy đúng version java thôi.

Sent from Brick using vozFApp
 
Đây là suy đoán của tôi, cao nhân nào sửa hộ nếu sai:
Việc copy thẳng file đã build vào docker là để chỉ tập trung tạo image docker nhanh deploy chỉ việc pull image và run nhiều instance dễ dàng.
Java bản thân nó chạy trên môi trường riêng JVM, JRE rồi nên chỉ cần đúng version là build ở win vứt vào linux vẫn chạy ok. Qua đó docker chỉ là để xác nhận chạy đúng version java thôi.

Sent from Brick using vozFApp
Thì bản chất Java là "viết 1 lần, dùng mọi nơi" theo khẩu hiệu, dùng môi trường Windows build ra jar, rồi ném vào docker image (môi trường Linux) chạy vẫn ok
 
Làm cách bác cũng được mà, có sao đâu. Mà lạ chỗ các tut docker cho nodejs hoặc FE thì đều copy source vào làm build stage, còn bên java toàn copy JAR đã build :( Hóng cao thủ vào thông não giúp.
Sách Spring Microservices in Action (2nd) cũng hướng dẫn copy jar. Còn FE react thì mình thấy build trong Docker thấy lâu nên build ở ngoài rồi copy vào nginx image cho khỏe.

Ngoài ra có 1 điểm nữa có khả năng FE hay được hướng dẫn build bằng Docker, đó có thể là do nodejs quản lý phiên bản không tốt bằng java, trong khi thực tế đôi lúc sẽ gặp project cần đúng node 14 mới chạy được chẳng hạn, trong khi máy lại đang cài node 18. Java thì cài bao nhiêu jdk, hãng nào làm cũng được, thích thì chọn để build, dùng IDEA đổi trong nháy mắt. Còn nodejs phải thông qua nvm, mà nvm ở Windows thì khá là ba chấm, nên build bằng Docker tiện hơn do thống nhất môi trường build -> đây cũng có thể là quan điểm cho việc build jar bằng Docker, dù build jar rất ít khi bị lỗi vặt xàm xàm như bên nodejs.
 
Last edited:
Nodejs lib thi thoảng có kèm file binary build sẵn (có thế là của các ngôn ngữ khác), nhưng file này tùy theo os chạy mà khác nhau. Nên cài ở os khác nhau copy sang có khả năng không chạy, nên phải lôi vào docker build.
Còn java như đã nói nó xây cả một jvm để làm môi trường nên ít sự khác nhau giữa các os. Điểm yếu của jvm là ăn ram như nước.

Sent from Brick using vozFApp
 
Sách Spring Microservices in Action (2nd) cũng hướng dẫn copy jar. Còn FE react thì mình thấy build trong Docker thấy lâu nên build ở ngoài rồi copy vào nginx image cho khỏe.

Ngoài ra có 1 điểm nữa có khả năng FE hay được hướng dẫn build bằng Docker, đó có thể là do nodejs quản lý phiên bản không tốt bằng java, trong khi thực tế đôi lúc sẽ gặp project cần đúng node 14 mới chạy được chẳng hạn, trong khi máy lại đang cài node 18. Java thì cài bao nhiêu jdk, hãng nào làm cũng được, thích thì chọn để build, dùng IDEA đổi trong nháy mắt. Còn nodejs phải thông qua nvm, mà nvm ở Windows thì khá là ba chấm, nên build bằng Docker tiện hơn do thống nhất môi trường build -> đây cũng có thể là quan điểm cho việc build jar bằng Docker, dù build jar rất ít khi bị lỗi vặt xàm xàm như bên nodejs.
a làm freelance à. làm cty máy móc cài ntn ra sao thống nhất hết. làm gì có vụ lung tung
 
Nodejs lib thi thoảng có kèm file binary build sẵn (có thế là của các ngôn ngữ khác), nhưng file này tùy theo os chạy mà khác nhau. Nên cài ở os khác nhau copy sang có khả năng không chạy, nên phải lôi vào docker build.
Còn java như đã nói nó xây cả một jvm để làm môi trường nên ít sự khác nhau giữa các os. Điểm yếu của jvm là ăn ram như nước.

Sent from Brick using vozFApp
Bên python hình như cũng thế, lâu lâu có vài thư viện không cài được trên Windows
 
cho tui hỏi cái này không liên quan, cái docker này mình chạy nó như env local được không thớt, vì tui chạy docker trên win ngốn ram quá mà ubuntu thấy nó nhẹ vl, nên đang tính move on qua ubuntu code luôn, nhưng ngại cái cài lại mấy cái env local :((
 
build bằng jib cho nó nhanh, config đơn giản (không cần Dockerfile), tận dụng layer còn tốt hơn cả cách Dockerfile của thớt, incremental build cực kỳ nhanh
 
build bằng jib cho nó nhanh, config đơn giản (không cần Dockerfile), tận dụng layer còn tốt hơn cả cách Dockerfile của thớt, incremental build cực kỳ nhanh
khách hàng ngày xưa là 1 enterprise lớn của US cũng chuyển từ dockerfile sang JIB. cái chính là ko phải quản lý cái đống dockerfile kia, mấy chục project update có mà mệt nghỉ.
 
JIB khá ok, mà bị cái bắt buộc có username với password của registry để build :( Không biết config sai gì không, đã thử pull base image trước, chạy docker login mà cũng vậy.
 
cho tui hỏi cái này không liên quan, cái docker này mình chạy nó như env local được không thớt, vì tui chạy docker trên win ngốn ram quá mà ubuntu thấy nó nhẹ vl, nên đang tính move on qua ubuntu code luôn, nhưng ngại cái cài lại mấy cái env local :((
Không hiểu env local theo ý bác là sao. Còn chạy docker trên win ngốn là đúng r do chạy trên WSL2.
 
cho tui hỏi cái này không liên quan, cái docker này mình chạy nó như env local được không thớt, vì tui chạy docker trên win ngốn ram quá mà ubuntu thấy nó nhẹ vl, nên đang tính move on qua ubuntu code luôn, nhưng ngại cái cài lại mấy cái env local :((
ubuntu thì chạy docker native thì nhẹ là phải rồi :dribble:

via theNEXTvoz for iPhone
 
cho tui hỏi cái này không liên quan, cái docker này mình chạy nó như env local được không thớt, vì tui chạy docker trên win ngốn ram quá mà ubuntu thấy nó nhẹ vl, nên đang tính move on qua ubuntu code luôn, nhưng ngại cái cài lại mấy cái env local :((
chưa hiểu ý thím
thì mình cài docker rồi start lên code thui
env local theo ý thím là sao nhờ
 
khách hàng ngày xưa là 1 enterprise lớn của US cũng chuyển từ dockerfile sang JIB. cái chính là ko phải quản lý cái đống dockerfile kia, mấy chục project update có mà mệt nghỉ.

Rồi lúc customize lòi mồm luôn. Bên tớ chuyển từ jib sang dockerfile. :D

Sent using vozFApp
 
Back
Top