Build & Run Docker Image cho Project Java/Groovy
TIL
720
White

Tất Huân viết ngày 08/06/2019

Luồng

Build Java/Groovy project -> Tạo Docker file -> Build Docker file thành Docker image -> Run Docker container từ Docker image vừa tạo

Gradle Build

gradle clean build

Output:

build/libs/spring-service-demo-1.0.0.jar

Dockerfile

FROM adoptopenjdk/openjdk8-openj9:jdk8u212-b03_openj9-0.14.0-alpine-slim
RUN mkdir /app
WORKDIR /app

ARG app_name
ARG app_version
ENV full_app_name=${app_name}-${app_version}.jar
COPY build/libs/${full_app_name} ./

ENTRYPOINT java -jar ${full_app_name}
EXPOSE <PORT>

Trong đó:

  • FROM adoptopenjdk/openjdk8-openj9:jdk8u212-b03_openj9-0.14.0-alpine-slim chỉ định base image
  • RUN mkdir /app lệnh RUN có thể execute các command cần thiết
  • WORKDIR /app chỉ định thư mục làm việc cho các command, tránh việc phải cd vào thư mục chứa application nhiều lần
  • ARG là cách khai báo biến arguments trong Dockerfile.\ Phạm vi sử dụng của biến ARG chỉ nằm trong build process - tức trong khi build docker image. Ở đây mình không khai báo giá trị mặc định vì giá trị của nó được passed vào qua lệnh build image.
  • ENV là cách khai báo biến môi trường trong container.\ Phạm vi sử dụng của biến này nằm trong cả build processcontainer.\ Tuy nhiên vì giá trị của nó chỉ được truyền động vào khi chạy container nên trong dockerfile này mình phải workaround bằng cách gán giá trị mặc địch của nó bằng giá trị của các biến ARG để có thể truyền động từ bước build tên file application.
  • COPY build/libs/${full_app_name} ./ cho phép copy dữ liệu từ host server vào docker image.
  • ENTRYPOINT java -jar ${full_app_name} là lệnh khởi chạy application.\ ENTRYPOINT được sử dụng để định nghĩa các câu lệnh chạy đầu tiên khi container khởi động.
  • EXPOSE <PORT> dùng để thể hiện port mà project này expose ra. Nó chỉ sử dụng để thể hiện, không tự động expose public port. Nếu muốn expose, chúng ta cần sử dụng tham số -p để chỉ thị chính xác các port được expose hoặc -P để tự động expose các port đã được khai báo bằng lệnh EXPOSE.\ Trong trường hợp này nên bỏ qua lệnh EXPOSE  nếu truyền động vào vì nó không mang ý nghĩa mô tả, hoặc fix cứng và application phải chạy trên port đã fix.

Build Docker Image

docker build\
 --build-arg app_name=s<APP_NAME>\
 --build-arg app_version=APP_VERSION>\
 -t spring-service-demo:<APP_VERSION>\
 ./

Trong đó:

  • --build-arg là cách truyền biến ARG cho build process.

    --build-arg key1=value1
    --build-arg key2=value2

  • -t là tham số dùng để chỉ định tag với pattern app_name:tag\
    Ở đây mình gán giá trị application version cho tag

  • ./ chỉ định thư mục chứa Dockerfile.

Run Docker Image

docker run\
--name spring-service-demo
--rm\
-p 127.0.0.1:<PORT>\
spring-service-test:<APP_VERSION>

Trong đó:

  • --name spring-service-demo chỉ định tên container
  • --rm chỉ định rằng container này sẽ được xoá khi container này dừng chạy.
  • -p được sử dụng để expose port ra host server
  • spring-service-test:<APP_VERSION> là tên image
  • Nếu muốn container run in backgroud, chúng ta có thể sử dụng tham số -d.

Lưu ý nếu muốn giữ lại dữ liệu và container sau khi stop, cần bỏ tham số --rm (Mình thường sử dụng khi test để đỡ công xoá container sau khi test xong)

Tất Huân 08-06-2019

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Tất Huân

6 bài viết.
2 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
5 0
Sử dụng Jacksondatabind mapping Object Json và ứng dụng load file config 1. Mapping Object Json Jacksondatabind Maven: com.fasterxml.jackson.c...
Tất Huân viết 1 năm trước
5 0
White
4 2
Một số hàm giúp mapping data đơn giản với Groovy Ví dụ với list data như sau: def student1 = name: "Huan", age: 22, gender: "male"] def student...
Tất Huân viết 1 năm trước
4 2
White
3 2
Giảm "quay tay" trên Intellij Hôm nay mình xin chia sẻ với anh em cách định nghĩa các template tương tự như thằng psvm mà chúng ta vẫn dùng hằng n...
Tất Huân viết hơn 2 năm trước
3 2
Bài viết liên quan
White
0 4
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 1 năm trước
0 4
White
2 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết 7 tháng trước
2 0
White
22 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết gần 3 năm trước
22 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
6 bài viết.
2 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!