在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建

  多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小;

  目前常见的两个构建镜像的方式为:

  1、直接使用某基础镜像,在此基础上安装环境构建应用、部署应用;

  2、构建应用和部署应用为不同镜像,使用某基础镜像构建应用,然后通过数据卷将应用共享给新镜像;

  第一种方式构建出来的镜像通常都非常大,而且还有许多构建应用时生成的飞运行应用所需要的问题,比如Maven就会生成不少依赖;

  第二种方式镜像稍有减小,做到了构建应与部署应用镜像的分离但又出现了新的问题,原本只需要一个Dockerfile现在分离后又多出来一个Dockerfile文件,管理Dockerfile与数据卷也都是麻烦的事情;

多阶段构建

  下面再Dockerfile文件中使用多阶段构建;

  1、该Dockerfile中有两个FROM为两步构建,在Maven基础镜像中编译生成Jar、依赖,这阶段命名为:BUILD

  2、使用linx/alpine-jdk8:0.1作为基础镜像,设置环境、创建目录,更重要的是使用COPY --from把BUILD阶段生成的项目文件拷贝到镜像中;

 FROM maven:3.5-jdk-8 as BUILD

 COPY src /usr/app/src
COPY pom.xml /usr/app
COPY ./docker/start.sh /usr/app/ RUN mvn -f /usr/app/pom.xml clean package -U -Dmaven.test.skip=true
RUN mvn -f /usr/app/pom.xml dependency:copy-dependencies FROM linx/alpine-jdk8:0.1 # 设置locale
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
ENV TZ=Asia/Shanghai RUN mkdir /app_home WORKDIR /app_home COPY --from=BUILD /usr/app/target/nettyDemo-1.0-SNAPSHOT.jar /app_home
COPY --from=BUILD /usr/app/target/dependency /app_home/dependency
COPY --from=BUILD /usr/app/start.sh /app_home
COPY ./docker/start.sh /app_home/
RUN chmod +x /app_home/start.sh CMD /app_home/start.sh

项目目录:

执行:docker build -t demo . 使用该Dockerfile文件构建镜像;

该镜像生成后:

文章首发地址:Solinx

http://www.solinx.co/archives/1111

多阶段构建Docker镜像的更多相关文章

  1. 使用Jenkins pipeline流水线构建docker镜像和发布

    新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...

  2. 打包应用和构建Docker镜像(docker在windows上)

    在构建Docker时编译应用 一般有两种方法在构建镜像时进行打包应用.第一种方法就是使用基本的镜像,该镜像包括应用平台和构建工具,因此在Dockerfile中,复制源代码到镜像中并在构建镜像时编译ap ...

  3. Docker:使用Jenkins构建Docker镜像

    Docker  彭东稳  1年前 (2016-12-27)  10709次浏览  已收录  0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...

  4. 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...

  5. 使用docker Maven插件本地构建docker镜像并发布到远程服务器

    1.登录网站https://start.spring.io/,生成一个基本的SpringBoot应用. 2.将应用导入Eclipse IDE并创建Application类.目录结构如下: Applic ...

  6. Maven插件构建Docker镜像

    背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...

  7. [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...

  8. 使用Buildpacks高效构建Docker镜像

    1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...

  9. SpringBoot 构建 Docker 镜像的 3 种方式

    本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...

随机推荐

  1. 同一台电脑同时装jdk1.8和jdk1.7

    因为之前安装的eclipse版本要求JDK1.8或以上的版本,但在搭建SSH框架的时候老是报错,又找不到2错误源.老师建议换个低版本的jdk.所以jdk版本需要降级. 但降级以后就不能打开eclips ...

  2. Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合

    简介:给正在学习的小伙伴们分享一下自己的感悟,如有理解不正确的地方,望指出,感谢~ 首先介绍一下这个标题吧~ 1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待 ...

  3. Python Cookbook 数据结构和算法

    1.查找最大或最小的N个元素 import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, n ...

  4. 使用Sales_data类

    写一段程序程序实现求两次交易相加结果的功能.程序的输入是下面这两条交易记录: 0-201-783456-X 3 20.00 0-201-783456-X 3 25.00 程序的结构如下: #inclu ...

  5. [经验交流] 影响 kubernetes 稳定性的因素

    使用k8s已有近一年的时间,版本从1.2到1.5.1.6.1.7,期间出现并解决了不少问题,下面是我总结的影响k8s集群稳定性的因素: 1. 安装环境 *kubelet版本最好与kube-apiser ...

  6. ubuntu server 16.04 安装过程中提示无法安装busybox-initramfs

    这个问题在安装desktop版本时是不会出现的,只有server才有这个问题. 出现这个问题与硬件平台无关,不管是虚拟机还是物理机都会出现,解决的办法是在安装开始界面选择English,后面Langu ...

  7. java的方法重写 ,多态和关键字 instanceof和final

    package cn.pen; /*final 是一个java的关键字,用于修饰局部变量.属性.方法.类,表示最终的意思. final修饰类表示最终类,无法被继承.public final class ...

  8. shell 其他杂项知识点笔记

    // 其他杂项知识点 对于普通用户,Base shell 默认的提示符是美元符号$:对于超级用户(root 用户),Bash Shell 默认的提示符是井号# ------- \#!是一个约定的标记, ...

  9. python-常见数据类型及其方法

    常见数据类型及其方法 1.None: 表示空(无任何功能,专门用于提供空值) 2.整形(int) 3.布尔类型(bool) 只有两个结果:True/False: 0/''/[]/()/{}/set() ...

  10. javaScript -- touch事件详解(touchstart、touchmove和touchend)

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...