alpine
基于alpine基础镜像构建,alpine只有5M左右,相比centos之类的小太了,而且软件包管理也方便。构建过程中,还有个技巧,如下示例:
apk add --no-cache --virtual .build-deps \
git \
binutils-gold \
g++ \
gcc \
gnupg \
libgcc \
linux-headers \
make \
python \
&& echo "do something build..." \
&& apk del .build-deps
通过apk安装软件包时,我们指定了虚拟包.build-deps,这样git之类的工具归属到虚拟包下,由于仅是构建阶段用到的命令,如执行npm install或pip install,当把项目构建完以后,通过apk del .build-deps清理掉所有临时命令即可。这样就可以保证构建出的镜像最小了。
Multi-stage Build
Docker 提供了 Multi-stage Build(多阶段构建),可以实现镜像瘦身。我们将镜像构建分成两个阶段:
在 ”build“ 阶段依然采用 JDK 作为基础镜像,并利用 Maven 进行应用构建; 在最终发布的镜像中,我们会采用 JRE 版本作为基础镜像,并从”build“ 镜像中直接拷贝出生成的 jar 文件。这意味着在最终发布的镜像中,只包含运行时所需必要内容,不包含任何编译时依赖,大大减少了镜像体积。
FROM adoptopenjdk/openjdk8 AS build
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y \
git \
maven
WORKDIR /tmp
RUN git clone https://github.com/spring-projects/spring-petclinic.git
WORKDIR /tmp/spring-petclinic
RUN mvn install
FROM adoptopenjdk/openjdk8:jre8u222-b10-alpine-jre
COPY --from=build /tmp/spring-petclinic/target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar
CMD ["java","-jar","spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar"]