在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阶段生成的项目文件拷贝到镜像中;

  1. FROM maven:3.5-jdk-8 as BUILD
  2. COPY src /usr/app/src
  3. COPY pom.xml /usr/app
  4. COPY ./docker/start.sh /usr/app/
  5. RUN mvn -f /usr/app/pom.xml clean package -U -Dmaven.test.skip=true
  6. RUN mvn -f /usr/app/pom.xml dependency:copy-dependencies
  7. FROM linx/alpine-jdk8:0.1
  8. # 设置locale
  9. ENV LANG en_US.UTF-8
  10. ENV LANGUAGE en_US:en
  11. ENV LC_ALL en_US.UTF-8
  12. ENV TZ=Asia/Shanghai
  13. RUN mkdir /app_home
  14. WORKDIR /app_home
  15. COPY --from=BUILD /usr/app/target/nettyDemo-1.0-SNAPSHOT.jar /app_home
  16. COPY --from=BUILD /usr/app/target/dependency /app_home/dependency
  17. COPY --from=BUILD /usr/app/start.sh /app_home
  18. COPY ./docker/start.sh /app_home/
  19. RUN chmod +x /app_home/start.sh
  20. 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. EOCS 最低资源保障机制

    本期小E将为大家带来EOCS 最低资源保障机制. 为满足普通用户日常的转账等基本需求,无需再为较少的初始资源抵押担心无法使用链上功能.EOCS可以通过链的参数来调整分配给每个用户免费的资源额度,相当于 ...

  2. 2018-2019-2 20165337《网络对抗技术》Exp2 后门原理与实践

    基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 下载破解游戏,盗版电影或安装来历不明的软件,可能被留下后门. (2)例举你知道的后门如何启动起来(win及linux)的方式? w ...

  3. Q - N! HDU - 1042

    使用java还不熟练,错误在于读入.应用in.hasNext() 代码 import java.text.ParseException; import java.text.SimpleDateForm ...

  4. 【转】一文掌握 Linux 性能分析之 CPU 篇

    [转]一文掌握 Linux 性能分析之 CPU 篇 平常工作会涉及到一些 Linux 性能分析的问题,因此决定总结一下常用的一些性能分析手段,仅供参考. 说到性能分析,基本上就是 CPU.内存.磁盘 ...

  5. 找到多个与名为“Home”的控制器匹配的类型。解决方法

    “/”应用程序中的服务器错误. 找到多个与名为“Home”的控制器匹配的类型.如果为此请求(“{controller}/{action}/{id}”)提供服务的路由没有指定命名空间以搜索与此请求相匹配 ...

  6. java程序性能分析之thread dump和heap dump

    一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...

  7. Linux Shell下”>/dev/null 2>&1“相关知识说明

    0:表示键盘输入(stdin)1:表示标准输出(stdout),系统默认是1 2:表示错误输出(stderr) command >/dev/null 2>&1 &  == ...

  8. Nodejs安装(npm、cnpm、webpack)

    1.nodejs官网对应下载(我的电脑对应的是64位的).https://nodejs.org/en/download/ 2.下载之后开始安装: 点击next按钮 点击next 点击next,进入下边 ...

  9. vue组件路由守卫钩子函数(beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave)

    用法:与mounted,created等同级并列. export default { data() { return { } }, methods: { go() { this.$router.pus ...

  10. flutter 解析json

    关于flutter 解析json 自己看了几天,最近才大概知道是怎么个情况. 首先 要处理的 是后端返回的数据 ,如果是直接请求的话返回的是json 字符串 然后要把字符串转成对象,有几种方式参考 第 ...