通常使用openjdk:8作为基础镜像进行构建,但由于体积过大,达到了惊人的700+MB,所以寻求了一些方法进行体积压缩。

使用 alpine 作为基础镜像

  1. FROM openjdk:8-jre-alpine
  2. ARG JAR_FILE=./*.jar
  3. COPY ${JAR_FILE} app.jar
  4. ENV TZ=Asia/Shanghai
  5. ENTRYPOINT ["java","-jar","/app.jar"]

使用alpine版本的基础镜像,体积压缩到了100MB左右,并且可以正常使用docker exec -ti <container_id> sh

使用 distroless 作为基础镜像

FROM gcr.io/distroless/java
ARG JAR_FILE=./*.jar
COPY ${JAR_FILE} app.jar
ENV TZ=Asia/Shanghai
ENTRYPOINT ["java","-jar","/app.jar"]

distroless镜像同样压缩了体积,与apline相当,但其内部不包含shell和linux,因此无法attach到容器内部。从某种意义来说,无法attach反而更安全。

后记

  • Google提供了一款名为jib的工具,据说可以自动构建出精简的Java镜像,并且无需编辑Dockerfile文件,甚至不需要安装docker,有机会要尝试一下