2018-02-14

Spring Boot 应用 Docker 镜像优化

前言

如何让 Spring Boot 应用的 docker 镜像体积更小?镜像制作速度更快?启动时参数可配置?

实战

1、先将 Spring Boot 应用打包:

1
$ mvn clean package

2、编写 Dockerfile,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM openjdk:8-jre-alpine

ADD target/*.jar app.jar

ENV ANY_REDIS_HOST=127.0.0.1 \
ANY_REDIS_PORT=6379 \
ANY_MARIADB_URL= \
ANY_MARIADB_USERNAME= \
ANY_MARIADB_PASSWORD=

VOLUME /tmp

CMD java -jar /app.jar \
--spring.redis.host=$ANY_REDIS_HOST \
--spring.redis.port=$ANY_REDIS_PORT \
--spring.datasource.url=$ANY_MARIADB_URL \
--spring.datasource.username=$ANY_MARIADB_USERNAME \
--spring.datasource.password=$ANY_MARIADB_PASSWORD \

其中 CMD 中的配置对应 Spring Boot 应用中 application.yml 的配置,打包前均可不填,使其能在 Docker 启动容器时再配置。

1
2
3
4
5
6
7
8
9
10
# application.yml 片段
# 数据库 及 Redis 配置
spring:
redis:
host:
datasource:
url:
driver-class-name: org.mariadb.jdbc.Driver
username:
password:

3、制作镜像

1
$  docker build -t any-video .

any-video 为镜像名, TAG 默认为 latest。

4、 查看镜像信息

1
2
3
[root@SilenceMac any-video]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
any-video latest 8681a026f5e2 13 minutes ago 113.1 MB

经过各种对比,基于 openjdk:8-jre-alpine 制作的镜像体积小,消耗时间短,有更佳选择的欢迎指出!

5、使用 Docker 启动应用,示例如下:

1
2
3
4
5
6
$ docker run -d --name any-video -p 8080:8080 \
-e ANY_REDIS_HOST=127.0.0.1 \
-e ANY_REDIS_PORT=6379 \
-e ANY_MARIADB_URL="jdbc:mysql://localhost:3306/any_db?useUnicode=true&characterEncoding=UTF-8" \
-e ANY_MARIADB_USERNAME=root \
-e ANY_MARIADB_PASSWORD=anycode any-video