最小化构建Docker镜像 2019-10-31 21:03:38 ## 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"] ``` ## Java相关 可以采用云原生java微服务框架,结合GraalVM构建native应用的最小包。 如:<https://quarkus.io/get-started/> ## 第三方工具 docker-slim # 附 ## 最小化镜像迁移 在一台电脑打包的镜像可能需要导出到其他机器安装使用。 可以用docker save后压缩,导出某个镜像。如果只是导出几个镜像这种方法没有啥问题。 如果导出的镜像较多,且这些镜像大多基于一个公共镜像构建,那就需要多做些考虑了,不然导出的文件放在一起回很大。 Docker用到了UnionFS技术,共用镜像的其实有文件共用的,我们可以考虑将整个images仓库搬走。 具体做法,可以借助registry私有化仓库完成。 示例: ```shell # 启动一个私有镜像仓库 docker run -d -p 5000:5000 -v /Users/stan/DockerData/registry:/var/lib/registry registry docker tag mysql:5 localhost:5000/mysql:5 docker push localhost:5000/mysql:5 ``` 再把`/Users/stan/DockerData/registry`的文件打包到目标机器,还原registry,拉镜像即可 非特殊说明,均为原创,原创文章,未经允许谢绝转载。 原始链接:最小化构建Docker镜像 赏 Prev 使用kubectl连接k8s集群提示x509: certificate证书无效的问题 Next JFrog Artifactory使用中遇到的一些坑