Spring-Boot with Docker

Dockerfile文件制作

1
2
3
4
5
6
7
8
9
10
#
FROM openjdk:8-jdk-alpine
#挂载匿名卷 防止容器存储层写入大量数据
VOLUME /tmp
#Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

docker build -t demo:1 .

The JAR_FILE could be passed in as part of the docker command E.g. for Maven:
JAR_FILE可以作为docker命令的一部分传入,就是target/*.jar

1
$ docker build --build-args=target/*.jar -t myorg/myapp .

如果你已经有了jar包则可以直接指定位置,来制作镜像

1
2
3
4
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

现在我们可以简单的构建镜像

1
$ docker build -t myorg/myapp .

然后运行

1
$ docker run -p 80:8080 myorg/app

如果你像进入镜像查看可以输入

1
2
3
4
5
$ docker run -ti --entrypoint /bin/sh myorg/myapp
/ # ls
app.jar dev home media proc run srv tmp var
bin etc lib mnt root sbin sys usr
/ #

目前docker的配置非常简单,但是效率不高。docker镜像有一个简单文件系统分层放置jar包,每一次
对程序的改动都会影响到该层,肯能是10M或者更多。我们应该将jar分到其他层来改善这种情况。

精简图像

上述构建镜像的基础镜像是:openjdk:8-jdk-alpine,这是一个比标准更为精简的镜像。然后你还可以使用“jre”而非
“jdk”来作为基础镜像可以省下20MB的空间,并不是说图像越小越好,小只是代表下载方便,前提是,他们的没有中间层被缓存

解压缩文件到target/depency目录,并构建docker镜像

1
2
3
$ mkdir target/dependency
$ (cd target/dependency; jar -xf ../*.jar)
$ docker build -t myorg/myapp .

构建镜像dockerFile

1
2
3
4
5
6
7
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]

多阶段构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM openjdk:8-jdk-alpine as build
WORKDIR /workspace/app

COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src

RUN ./mvnw install -DskipTests
RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=/workspace/app/target/dependency
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]

docker-compose的max-size选项来实现控制容器日志大小