月度归档: 2017 年 9 月

  • 使用Docker多阶段构建生成更小的镜像

    使用Docker多阶段构建生成更小的镜像

    在将源码直接打为Docker镜像的时候,经常纠结的一个问题就是如何获得更小的镜像。

    以一个java项目为例,因为java编译的时候需要jdk,而运行的时候只需要jre,明显jre的大小更有优势。同时由于各种构建工具的存在(比如gradle,maven),下载的构建用的文件也很多,不光是maven的依赖,还有wrapper和一些临时文件。

    之前的做法一直是使用两个Dockerfile,其中一个使用jdk构建出需要的jar文件,然后第二个使用jre直接将jar文件复制进去。虽然效果不错,但是还是觉得麻烦。

    今天使用Daocloud的时候看到了安全构建这个选项(本质就是两段构建),就突然想到Docker会不会已经有了。结果一搜索还真有,亏我还用多Dockerfile构建了很长时间。

    大概使用如下:

    FROM openjdk:8 AS build-env
    ADD . /java/src/app
    WORKDIR /java/src/app
    RUN gradlew build
    
    FROM openjdk:jre
    RUN apk add -U tzdata
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
    COPY --from=build-env /java/src/app/build/libs/target.jar /usr/local/bin/app-server
    EXPOSE 8080
    CMD ["app-server"]

    Docker支持的是多阶段构建,所以如果有需要的话,可以从多个不同的构建中获得生成物。…