Spring boot with docker

Spring boot with docker

Spring-boot 官方教學:https://spring.io/guides/gs/spring-boot-docker/,
做法跟設定跟官方教學有些不太一樣, 不考慮用 maven plugin 維護 docker images, 方便 devOps 統一管理。

Set up Spring-boot

  1. 先建立 spring-boot 專案, 專案命名為 demo-docker-spring
  2. 建立 controller, 簡單 echo Hello Docker World


package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by jerry on 2018/1/15.
 *
 * @author jerry
 */
@Slf4j
@RestController
public class Controller {

    @RequestMapping("/")
    public String home() {
        return "Hello Docker World";
    }
}


Dockerfile

docker 官方不支援 oracle-java, 所以找了一個 star 較高的 image 來用。 Dockerfile 就直接放在專案底下。


# https://hub.docker.com/_/java/ 不支援 oracle-java
# FROM: 指定 base image (https://hub.docker.com/r/cogniteev/oracle-java/)
FROM cogniteev/oracle-java

# expose 8080 port
EXPOSE 8080

# 複製當前路徑所有資料, 到容器裡面
COPY . /usr/app/demo-docker-spring

# WORKDIR: 指定 docker 執行起來時候的預設目錄位置
WORKDIR /usr/app/demo-docker-spring

# 在容器裡面編譯
RUN ./mvnw clean package

# 指定容器啟動後執行的命令,並且不會被 docker run 提供的參數覆蓋。
ENTRYPOINT ["java","-jar","target/demo-docker-spring-0.0.1.jar"]

Docker build

# 以本地的 Dockerfile 為基礎, 建立 image
docker build -t jerry80409/demo-docker-spring:0.0.1 .

Docker run

docker run -d \
    --name demo-docker-spring \
    -p 8080:8080 \
    jerry80409/demo-docker-spring:0.0.1

心得

在容器裡面執行 ./mvnw clean package 會延長 container 啟動的時間, 萬一編譯失敗還要去看 docker logs 過濾, 比較好的做法還是在 host 處理相關的編譯與測試, 修改為

Dockerfile

# https://hub.docker.com/_/java/ 不支援 oracle-java
# FROM: 指定 base image (https://hub.docker.com/r/cogniteev/oracle-java/)
FROM cogniteev/oracle-java

# expose 8080 port
EXPOSE 8080

# 版本管理, 接收 docker build --build-arg 指定的參數
ARG APP_VERSION

# 複製編譯後的 jar , 到容器裡面
COPY target/${APP_VERSION} /usr/app/demo-docker-spring/app.jar

# WORKDIR: 指定 docker 執行起來時候的預設目錄位置
WORKDIR /usr/app/demo-docker-spring

# 在容器裡面編譯
# RUN ./mvnw clean package

# 指定容器啟動後執行的命令,並且不會被 docker run 提供的參數覆蓋。
ENTRYPOINT ["java","-jar","app.jar"]

Docker build

透過 --build-arg 動態指定編譯好的 jar 檔, 方便在不同版本號使用。

# 以本地的 Dockerfile 為基礎, 建立 image
docker build \
  --build-arg APP_VERSION=demo-docker-spring-0.0.1.jar \
  -t jerry80409/demo-docker-spring:0.0.1 .

Docker run

docker run -d \
    --name demo-docker-spring \
    -p 8080:8080 \
    jerry80409/demo-docker-spring:0.0.1

沒有留言:

張貼留言