Spring boot with docker
Spring-boot 官方教學:https://spring.io/guides/gs/spring-boot-docker/,
做法跟設定跟官方教學有些不太一樣, 不考慮用 maven plugin 維護 docker images, 方便 devOps 統一管理。
Set up Spring-boot
- 先建立 spring-boot 專案, 專案命名為 demo-docker-spring
- 建立 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