在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基础---入门

    JDK的安装和环境变量的配置: 在Oralce官网下载好符合自己电脑配置的JDK后开始配置环境变量. 找到下载好的JDK的位置,复制,然后在环境变量里创建“JAVA_HOME”,粘贴:在path里用“ ...

  2. 开发一个项目之代码规范ESLint

    ESLint{ "rules": { "semi": ["error", "always"], } }error lev ...

  3. Hibernate-注解

    一, 为啥用注解 Hibernate注解使得原本放在xml文件中的信息直接表现在类中 为什么要用注解呢,因为注解可以简洁快速地在编写代码的同时实现映射关系 注解的好处就是语言简洁,即插即用.  坏处就 ...

  4. Java 多线程 - 锁优化

    http://www.cnblogs.com/pureEve/p/6421273.html https://www.cnblogs.com/mingyao123/p/7424911.html

  5. 【easy】108. Convert Sorted Array to Binary Search Tree

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  6. C# 登陆验证码工具类VerifyCode

    using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; ...

  7. (转)理解maven命令package、install、deploy的联系与区别

    我们在用maven构建java项目时,最常用的打包命令有mvn package.mvn install.deploy,这三个命令都可完成打jar包或war(当然也可以是其它形式的包)的功能,但这三个命 ...

  8. springboot 多模块打war 部署

    先展示一下自己项目结构 一共有5个模块 依赖关系:下面的模块依赖上面所有的模块 其中 rongke-web是我要部署的模块 最终要打war进行部署,其他模块均打jar 被rongke-web引用. 开 ...

  9. qt学习笔记

    Part 1基本思路 学习目标:(熟练)使用 qt 制作符合要求的 ui FAQ:1)学习Qt5还是Qt4? 重要的是学习的方法而不是内容,掌握了正确的学习方法就可以很快完成另一者的学习,综合来看,Q ...

  10. JpaManytoMany

    package com.allqj.calculator.entity; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; i ...