多阶段构建Docker镜像
在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镜像的更多相关文章
- 使用Jenkins pipeline流水线构建docker镜像和发布
新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...
- 打包应用和构建Docker镜像(docker在windows上)
在构建Docker时编译应用 一般有两种方法在构建镜像时进行打包应用.第一种方法就是使用基本的镜像,该镜像包括应用平台和构建工具,因此在Dockerfile中,复制源代码到镜像中并在构建镜像时编译ap ...
- Docker:使用Jenkins构建Docker镜像
Docker 彭东稳 1年前 (2016-12-27) 10709次浏览 已收录 0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...
- 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...
- 使用docker Maven插件本地构建docker镜像并发布到远程服务器
1.登录网站https://start.spring.io/,生成一个基本的SpringBoot应用. 2.将应用导入Eclipse IDE并创建Application类.目录结构如下: Applic ...
- Maven插件构建Docker镜像
背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...
- [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...
- 使用Buildpacks高效构建Docker镜像
1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...
- SpringBoot 构建 Docker 镜像的 3 种方式
本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...
随机推荐
- tomcat去掉ContextPath
众所周知,项目打成war包直接放到webapps下启动tomcat后访问项目需要带上ContextPath,也就是war包的文件名,需要去除掉这玩意最简单的办法是将war包重命名为ROOT.war,为 ...
- sql注入--双查询报错注入原理探索
目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客, ...
- module.exports与exports区别
CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. ...
- 圈水池 nyoj 78 凸包算法
圈水池 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水, ...
- [Linux]信号集和sigprocmask信号屏蔽函数
一.概述 系统提供这样一种能力,就是创建一个信号集,然后传递给信号屏蔽函数,从而屏蔽向该进程发送的信号. 有一点需要注意的是,不能屏蔽SIGKILL和SIGSTOP信号. 信号集是sigset_t类型 ...
- leveldb(ssdb)性能、使用场景评估
最近有个业务场景存储压力很大,写远远大于读,读也集中在最近写入,想想这不很适合采用leveldb存储么.leveldb的话好像用ssdb比较多,花了两天时间就ssdb简单做下测试,以下总结. ssdb ...
- MyOD(课下作业,选做)
MyOD(课下作业,选做) 代码要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...
- 【JS】VUE学习
VUE的全家桶:vue-cli,vue-router,vue-resource,vuex 环境搭建:https://www.jianshu.com/p/32beaca25c0d 先码在这儿吧. htt ...
- 七 Git版本控制
把环境准备 主机名 node1 ip地址10.0.0.11 node2 10.0.0.12 node3 ...
- 设置mysql数据库为只读
设置命令: mysql> set global read_only=1; #1是只读,0是读写 mysql> show global variables like "%re ...