1. 前言

Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像。这是什么科技?我赶紧去官网查了一番才知道用的是基于云原生的Buildpacks技术,这是一个直接将代码转换为容器镜像的技术,它意味着你不用在写Dockerfile文件了。

但是 Spring Boot 2.3.0.RELEASE 的镜像构建插件好像有BUG,等后续修复吧。但是本文的相关实践并不采用官方的插件

2. 灵魂追问

在了解这种技术之前,我们先想想我们开发的Java应用运行起来都需要什么?

  1. 首先你得编写业务逻辑代码吧,这是最基本的。
  2. 你的应用配置环境,也可以成为Profile,比如Spring Boot应用中 application.yml 的环境配置。
  3. 特定的语言环境,Java需要跑在JVM上, 其它语言也对应的需要它们的特定环境。
  4. 运行时环境,比如我们的Spring Boot应用还可能依赖其它中间件、第三方类库等等。

如果我们有一种工具来处理这些问题就好了,我们可以快速的实现从源码到运行时的工作流程。

3. 和Dockerfile相比

Buildpacks就是来解决这一问题的。这不是重复的轮子!与我们熟悉的Dockerfile相比,Buildpacks为构建应用程序提供了更高层次的构建抽象。

  • 减轻了开发者的负担,并支持大规模的应用程序的管理。
  • 多语言支持,针对特定的编程语言有特定的一揽子构建机制,比如 JavaGolangRubyPython等。
  • 保证应用构建的安全性和合规性,而无需开发者干预。
  • 提供操作系统级别和应用程序级别的依赖关系升级的自动交付,屏蔽了Dockerfile 的复杂性。
  • 提供merge功能,让我们可以在原来的基础上增加新的功能和补丁,而无需重新构建。

2. 安装Buildpacks

目前Buildpacks 支持 LinuxMacOSWindows。你可以从 Buildpacks的官方文档获取详细的安装方法,因为过于简单这里不再介绍。

别忘记配置 Buildpacks 的环境变量。在 Win10 上需要将 Buildpacks 的安装目录配置到 path 环境变量中。

如果Buildpacks 的路径为 D:\pack-v0.10.0-windows\pack.exe 则:

然后命令行执行 pack version,打印出版本号就表示安装成功了。

安装Buildpacks的先决条件是,拥有Docker运行时,你需要在对应操作系统上安装并运行Docker

3. 从代码构建Docker镜像

这里我们使用一个标准的Spring Boot项目,在项目的根目录下需要安装 Maven wrapperMaven 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. 总结

BuildpacksCNCF基金会的孵化项目,此次Spring Boot 2.3.0.RELEASE和它的结合,是Spring Boot构建云原生应用的重要里程碑。后面我会抽时间对Buildpacks进行进一步的介绍,敬请关注我的个人博客felord.cn

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

使用Buildpacks高效构建Docker镜像的更多相关文章

  1. 多阶段构建Docker镜像

    在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...

  2. 使用Jenkins pipeline流水线构建docker镜像和发布

    新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...

  3. Docker:使用Jenkins构建Docker镜像

    Docker  彭东稳  1年前 (2016-12-27)  10709次浏览  已收录  0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...

  4. 打包应用和构建Docker镜像(docker在windows上)

    在构建Docker时编译应用 一般有两种方法在构建镜像时进行打包应用.第一种方法就是使用基本的镜像,该镜像包括应用平台和构建工具,因此在Dockerfile中,复制源代码到镜像中并在构建镜像时编译ap ...

  5. 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...

  6. 使用docker Maven插件本地构建docker镜像并发布到远程服务器

    1.登录网站https://start.spring.io/,生成一个基本的SpringBoot应用. 2.将应用导入Eclipse IDE并创建Application类.目录结构如下: Applic ...

  7. Maven插件构建Docker镜像

    背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...

  8. [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...

  9. SpringBoot 构建 Docker 镜像的 3 种方式

    本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...

随机推荐

  1. if __name=='__main__"的作用

    1.__main__的作用 我们可以经常在不同的程序和脚本中看到有这样的代码: if __name__=='__main__':#如果在windows上启动线程池,必须要使用. func() 很多情况 ...

  2. 深入实践Spring Boot1.4 运行与发布

    1.4 运行与发布 本章实例工程的完整代码可以使用IDEA直接从GitHub的https://github.com/chen-fromsz/spring-boot-hello.git中检出,如图1-1 ...

  3. 从「Hello World」说起

    标签: node模块 从一个简单「hello world」程序对 node.js 有个感性的认识. const http = requier ('http'); const pathname = '1 ...

  4. C++条件分支结构

    一.对于近期学习知识点的摘要: 1. 从第一个.cpp文件谈起, #include<iostream> //头文件 using namespace std; //使用命名空间,namesp ...

  5. 图论--二分图最佳完美匹配(KM模板)

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; cons ...

  6. js数组中返回具有某个属性具有特定值的对象

    const drDataArr = [{ date: 0, type: '心率', value: 82 },{ date: 1, type: '心率', value: 80 },{ date: 2, ...

  7. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

  8. JAVA设计模式之单例(singleton)

    一.饿汉式 /** * 饿汉式 */public class Singleton01 { private static final Singleton01 instance = new Singlet ...

  9. basicRF双向灯光控制

    题目: 实现基于BasicRF无线点对点通信的双向灯光控制,具体要求如下: 1> 节点A 和节点B 的PANID设置为0x1234,通道号设置为17,节点地址自定义.<2> 按下节点 ...

  10. leetcode485——最大连续1的个数(easy)

    一.题目描述 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意 ...