原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html

前言

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

S2I介绍

S2I是Source-to-Image的缩写。

S2I是一套工具包和工作流程,用于从源代码构建重复性Docker镜像。

S2I是一个框架,它使写镜像变得简单。它把程序源代码作为输入,生成一个运行已组装应用程序的新镜像并作为输出。

S2I的详细介绍以及使用方法可以参考以下官方文档。本文就不复述(fan yi)了。

两种构建方式的过程

Talk is Cheap, Show me the Picture.
先上图。

源代码只是构建镜像的多种输入的一种,还有二进制文件等其它输入。镜像构建的过程也比较复杂。下图是为了清晰地进行对比,所以画得简单一些。

由上图可以看出,Dockerfile方式的构建过程比较直接:

  • 根据Dockerfile定义的步骤,读取源代码,生成镜像(成品)。

而S2I方式的构建过程比较“曲折”:

  • 根据Dockerfile定义的步骤,准备镜像环境、读取S2I脚本,构建镜像(中间)。
  • 基于上一步生成的镜像(中间),读取源代码,根据S2I脚本定义的步骤编译源代码、部署二进制程序、八戒影院预备服务启动,构建镜像(成品)。

从上述过程可以看出,S2I方式比Dockerfile方式多了一步,多了两样东西:S2I脚本和镜像(中间)。

S2I脚本介绍

S2I脚本有4种。

  • assemble: 负责构建程序,即编译、部署程序。
  • run: 负责启动应用。
  • save-artifacts: 负责增量构建(镜像),目前尚未使用。
  • usage: 负责打印构建器镜像的使用说明。

S2I方式的好处

关于引入S2I构建镜像的好处,书面类的描述可以参考官方文档,这里谈谈实践下来个人的感受和理解。

首先,要了解为什么要引入S2I。

如果一定要把构建镜像分为两部分,可以分为

  1. 环境准备
  • 定义基础镜像;
  • 安装所需部件,如Maven、Java JDK;
  • 拷贝/移动文件/目录;
  • 定义用户;
  • 暴露端口等。
  1. 源代码相关
  • 编译源代码;
  • 部署二进制程序;
  • 定义服务启动方式等。

引入S2I的目的就是为了分离这两部分的工作。

其中环境准备工作交给了构建器镜像,

构建器镜像一旦生成将保持不变,可理解为静态部分。

而源代码相关工作交给了S2I脚本。

在构建镜像(成品)过程中,S2I将根据S2I脚本定义的步骤进行源代码编译、二进制程序部署、服务启动预备,可以理解为动态部分。

这样的分离带来了如下好处:

  1. 对于环境依赖相近、构建部署启动过程相似的程序,由于有构建器镜像的存在,构建过程不需要再次进行环境准备工作,从而节省了构建镜像(成品)的时间。
  2. 分工明确。构建工作的分离允许应用程序开发人员对他们的代码进行更改,而不用知道Dockerfile或Docker镜像的细节。如果镜像构建交付给S2I或PaaS(platform as a service)平台,开发工程师不需要理解Docker来对项目作出贡献。第九影院这在一个由很多人组成的企业环境中是非常有用的,这些人都有不同的专业方向,而且并不直接涉及到他们项目的构建过程。

[转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式的更多相关文章

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

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

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

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

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

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

  4. 多阶段构建Docker镜像

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

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

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

  6. Maven插件构建Docker镜像

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

  7. 基于url-to-pdf-api构建docker镜像,制作一个网页另存服务

    基于url-to-pdf-api构建docker镜像,制作一个网页另存服务 业务背景: 需要根据一个url路径打印这个网页的内容 解决方案: 1.使用wkhtml2pdf 2.使用puppeteer ...

  8. 如何构建Docker镜像

    构建Docker 镜像有如下两种方法: (一)使用docker commit命令.(二)使用docker build命令和 Dockerfile 文件.在这里并不推荐使用docker commit来构 ...

  9. Java SpringBoot 项目构建 Docker 镜像调优实践

    PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...

随机推荐

  1. JUC-0-JUC简介

    Java JUC  简介   在 Java 5.0 提供了 java.util.concurrent (简称 JUC )包,在此包中增加了在并发编程中很常用 的实用工具类,用于定义类似于线程的自定义子 ...

  2. Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul)

    Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul) 1.Eureka Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是 ...

  3. javax.imageio.IIOException: Can't read input file!完美解决

    今天遇到一个问题,上图 这段代码主要是给图片添加水印 后来百度发现可能是图片的路径出了问题,因为是动态获取的图片地址,然后我把地址打印出来了 之后通过终端查看,果然没有 之后我在classes目录找到 ...

  4. 201871010116-祁英红《面向对象程序设计(java)》第十三周学习总结

    博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://ww ...

  5. 201871020225-牟星源 《面向对象程序设计(java)》第一周学习总结

    正文 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daiz ...

  6. nginx学习(三):nginx的进程模型

    概述 nginx 进程分为 master进程和work进程 1.打开配置文件查看,这里我修改为2 [root@xxx conf]# vim nginx.conf #user nobody; worke ...

  7. 第05组 Alpha事后诸葛亮

    组长博客链接(2分) 组长博客链接 现代软件工程 项目Postmortem 模板(27分) 设想和目标(2分) 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ...

  8. Centos7升级gcc极简教程

    centos7默认gcc版本为4.8,一般不满足编译需求,因此升级gcc版本为常见操作: 现有博客中,大多数教程都是基于源码重新编译安装:但是源码编译过程等待时间很长且编译麻烦. 因此,直接基于命令升 ...

  9. 在 ASP.NET Core 项目中使用 npm 管理你的前端组件包

    一.前言 在项目的前端开发中,对于绝大多数的小伙伴来说,当然,也包括我,不可避免的需要在项目中使用到一些第三方的组件包.这时,团队中的小伙伴是选择直接去组件的官网上下载,还是图省事直接在网上搜索,然后 ...

  10. pytest框架之parametries数据驱动参数化

    在测试用例的前面加上:@pytest.mark.parametrize('参数名', 列表数据) 参数名:用来接收每一项数据,并作为测试用例的参数 列表参数:一组测试数据(元组.列表.字典) 方式一: ...