通常使用openjdk:8
作为基础镜像进行构建,但由于体积过大,达到了惊人的700+MB,所以寻求了一些方法进行体积压缩。
使用 alpine 作为基础镜像
FROM openjdk:8-jre-alpine
ARG JAR_FILE=./*.jar
COPY ${JAR_FILE} app.jar
ENV TZ=Asia/Shanghai
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,有机会要尝试一下