在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. Java compiler 并行编译思考

    一.问题 最近基于JSR269做的代码插桩有一个编译问题需要定位,而且问题不是每次都能复现,需要多编译几次才行,出问题的项目是Maven构建的,相对较大,每次构建耗时就比较长.所以我就想,是否有什么配 ...

  2. Collection和Map类图预览与比较

    类图 HashSet和TreeSet的区别:https://www.cnblogs.com/bobi1234/p/10759769.html HashSet和LinkedHashSet区别:https ...

  3. bootstrap时间格式化

    /** * 将"2018-05-19T08:04:52.000+0000"这种格式的时间转化为正常格式 * @param time */ function timeFormat(t ...

  4. Web项目容器集成ActiveMQ & SpringBoot整合ActiveMQ

    集成tomcat就是随项目启动而启动tomcat,最简单的方法就是监听器监听容器创建之后以Broker的方式启动ActiveMQ. 1.web项目中Broker启动的方式进行集成 在这里采用Liste ...

  5. day09 详解内存管理机制

    """ 今日内容:详解内存管理 1.引用计数 在内存中为了对变量的值进行标记从而方便管理,采用引用计数的方式对变量进行标记. (1)如果变量的值被引用一次,那么该变量的引 ...

  6. recurrent model for visual attention

    paper url: https://papers.nips.cc/paper/5542-recurrent-models-of-visual-attention.pdf year: 2014 abs ...

  7. multiwan 脚本

    以下为校区ACM实验室多拨脚本,使用了macvlan模块,具体策略路由和连接标记等思路就不解释了. #! /bin/bash getip() { |grep -o -e 'inet addr:[^ ] ...

  8. 如何使用npm构建一个react demo项目

    方法一: 1) 安装node.js环境  点我进入nodejs官网 1.1) 下载LTS(Long term support)版本,安装 1.2) 在cmd中使用以下命令查看node是否安装成功 no ...

  9. js 本地缓存localStorage

    .localStorage - 没有时间限制的数据存储 ,,]; localStorage.setItem("stor",arr); console.log(localStorag ...

  10. 常用函数php

    //随机数 /** * @param int $length 随机数长度 * @param string $num 是否只包含数字 * @return null|string 返回随机字符串 */ f ...