使用Buildpacks高效构建Docker镜像

1. 前言
Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像。这是什么科技?我赶紧去官网查了一番才知道用的是基于云原生的Buildpacks技术,这是一个直接将代码转换为容器镜像的技术,它意味着你不用在写Dockerfile文件了。
但是 Spring Boot 2.3.0.RELEASE 的镜像构建插件好像有BUG,等后续修复吧。但是本文的相关实践并不采用官方的插件。
2. 灵魂追问
在了解这种技术之前,我们先想想我们开发的Java应用运行起来都需要什么?
- 首先你得编写业务逻辑代码吧,这是最基本的。
- 你的应用配置环境,也可以成为Profile,比如Spring Boot应用中
application.yml的环境配置。 - 特定的语言环境,Java需要跑在JVM上, 其它语言也对应的需要它们的特定环境。
- 运行时环境,比如我们的Spring Boot应用还可能依赖其它中间件、第三方类库等等。
如果我们有一种工具来处理这些问题就好了,我们可以快速的实现从源码到运行时的工作流程。
3. 和Dockerfile相比
Buildpacks就是来解决这一问题的。这不是重复的轮子!与我们熟悉的Dockerfile相比,Buildpacks为构建应用程序提供了更高层次的构建抽象。
- 减轻了开发者的负担,并支持大规模的应用程序的管理。
- 多语言支持,针对特定的编程语言有特定的一揽子构建机制,比如 Java、Golang、Ruby、Python等。
- 保证应用构建的安全性和合规性,而无需开发者干预。
- 提供操作系统级别和应用程序级别的依赖关系升级的自动交付,屏蔽了Dockerfile 的复杂性。
- 提供merge功能,让我们可以在原来的基础上增加新的功能和补丁,而无需重新构建。

2. 安装Buildpacks
目前Buildpacks 支持 Linux、MacOS、Windows。你可以从 Buildpacks的官方文档获取详细的安装方法,因为过于简单这里不再介绍。
别忘记配置 Buildpacks 的环境变量。在 Win10 上需要将 Buildpacks 的安装目录配置到 path 环境变量中。
如果Buildpacks 的路径为 D:\pack-v0.10.0-windows\pack.exe 则:

然后命令行执行 pack version,打印出版本号就表示安装成功了。
安装Buildpacks的先决条件是,拥有Docker运行时,你需要在对应操作系统上安装并运行Docker 。
3. 从代码构建Docker镜像
这里我们使用一个标准的Spring Boot项目,在项目的根目录下需要安装 Maven wrapper。Maven Wrapper的作用是:发现用户的Maven版本和期望的版本不一致,下载期望的版本,然后用期望的版本来执行mvn命令,安装命令为:
mvn -N io.takari:maven:wrapper
一般从 Spring Initializr 生成的项目都自带Maven wrapper。
完成上面的几步之后。执行下面的命令构建Docker镜像:
pack build myapp --builder cnbs/sample-builder:bionic
执行完毕后你的 Docker 镜像就构建完毕了,甚至有需要的话你可以再追加 --publisher命令将镜像上传到Docker镜像仓库。 和以往不同的是无需编写Dockfile文件。
初次构建的时间可能会比较长,因为要安装一些基础设施,以后再构建就会快得多,因为会重用这些有用的缓存。有兴趣的可以对比一下。
4. 总结
Buildpacks是CNCF基金会的孵化项目,此次Spring Boot 2.3.0.RELEASE和它的结合,是Spring Boot构建云原生应用的重要里程碑。后面我会抽时间对Buildpacks进行进一步的介绍,敬请关注我的个人博客felord.cn。
关注公众号:Felordcn 获取更多资讯
使用Buildpacks高效构建Docker镜像的更多相关文章
- 多阶段构建Docker镜像
在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...
- 使用Jenkins pipeline流水线构建docker镜像和发布
新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...
- Docker:使用Jenkins构建Docker镜像
Docker 彭东稳 1年前 (2016-12-27) 10709次浏览 已收录 0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...
- 打包应用和构建Docker镜像(docker在windows上)
在构建Docker时编译应用 一般有两种方法在构建镜像时进行打包应用.第一种方法就是使用基本的镜像,该镜像包括应用平台和构建工具,因此在Dockerfile中,复制源代码到镜像中并在构建镜像时编译ap ...
- 构建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的童鞋多少 ...
- SpringBoot 构建 Docker 镜像的 3 种方式
本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...
随机推荐
- Vue项目中jQuery的引入
1.安装jQuery依赖 npm install jquery --save-dev 2.在webpack.base.conf.js头部加入如下代码 var webpack = require(&qu ...
- Spring PropertyPlaceholderConfigurer类载入外部配置
2019独角兽企业重金招聘Python工程师标准>>> 通常在Spring项目中如果用到配置文件时,常常会使用org.springframework.beans.factory.co ...
- POJ 2054 Color a Tree解题报告
题干 Bob is very interested in the data structure of a tree. A tree is a directed graph in which a spe ...
- [CodeForces-259C] Little Elephant and Bits
C. Little Elephant and Bits time limit per test 2 seconds memory limit per test 256 megabytes input ...
- Datasource Server returns invalid timezone问题
今天在学习一个项目的时候,idea中的datasource没有配置,后来发现mysql没有连接,于是下载了最新版的jdbc.jar包,连接mysql完成后,想test一下mysql connect,结 ...
- 斜率dp A - Print Article HDU - 3507
A - Print Article HDU - 3507 今天刚刚学习了一下斜率dp,感觉还ok,主要就是要推这个斜率,然后利用数据结构来优化. 推荐两篇写的比较好的博客,https://www.cn ...
- 201771010113 李婷华 《面向对象程序设计(java)》第十五周总结
一.理论知识部分 JAR文件 Java程序的打包:程序编译完成后,程序员将.class文件压缩打包为.jar文件后,GUI界面程序就可以直接双击图标运行. .jar文件(Java归档)既可以包含类文件 ...
- SpringCloud (一) :微服务架构
什么是微服务架构 简而言之,微服务架构风格就是将单一应用的开发分为多个小的服务,每个小的服务在自己的进程中运行并使用轻量级机制进行通信(通常是一个HTTP API源),这些服务围绕业务性能进行构建,并 ...
- 第三家面试过程,及导出elcel的进一步小结。(8月11号 周五)
今天收到第三家公司的面试通知,面试地址也在民治附近,面试时间是上午十点.今早又失眠了,感觉到这边这么几天,总是天天失眠,晚上睡不好白天瞌睡睡不着,估计还需要些许时间的适应,早上七点多我整理好面试需要准 ...
- scala 隐式参数
def test(implicit name: String = "susu"): Unit ={ println(name);} 三种调用方法如下:test("dudu ...