资讯专栏INFORMATION COLUMN

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

WelliJhon / 2506人阅读

摘要:是一套工具包和工作流程,用于从源代码构建重复性镜像。由上图可以看出,方式的构建过程比较直接根据定义的步骤,读取源代码,生成镜像成品。源代码相关编译源代码部署二进制程序定义服务启动方式等。

前言

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

S2I介绍

S2I是Source-to-Image的缩写。

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

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

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

Source-To-Image (S2I)

S2I Requirements

How to Create an S2I Builder Image

两种构建方式的过程

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

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

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

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

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

根据Dockerfile定义的步骤,准备镜像环境、读取S2I脚本,构建镜像(中间)<又称构建器镜像 Builder Image>。

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

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

S2I脚本介绍

S2I脚本有4种。

assemble: 负责构建程序,即编译、部署程序。

run: 负责启动应用。

save-artifacts: 负责增量构建(镜像),目前尚未使用。

usage: 负责打印构建器镜像的使用说明。

S2I方式的好处

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

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

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

环境准备

定义基础镜像;

安装所需部件,如Maven、Java JDK;

拷贝/移动文件/目录;

定义用户;

暴露端口等。

源代码相关

编译源代码;

部署二进制程序;

定义服务启动方式等。

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

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

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

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

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

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

对于环境依赖相近、构建部署启动过程相似的程序,由于有构建器镜像的存在,构建过程不需要再次进行环境准备工作,从而节省了构建镜像(成品)的时间。

分工明确。构建工作的分离允许应用程序开发人员对他们的代码进行更改,而不用知道Dockerfile或Docker镜像的细节。如果镜像构建交付给S2I或PaaS(platform as a service)平台,开发工程师不需要理解Docker来对项目作出贡献。这在一个由很多人组成的企业环境中是非常有用的,这些人都有不同的专业方向,而且并不直接涉及到他们项目的构建过程。

(注) 上述好处2引用了文章:使用Source-to-image(S2I)构建镜像的描述

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27182.html

相关文章

  • 自定义 OpenShift s2i 镜像与模板——OracleJDK8

    摘要:自定义镜像部分自定义镜像部分安装工具安装工具工具官方下载工具解压工具到查看版本初始化目录结构初始化目录结构笔者是在目录下开始操作的,提前说下免得读者操作有误。修改修改脚本只作启动功能,为了方便传调优参数,定制了环境变量供使用。 本文目标 由于 OpenShift 官方提供的镜像与模板(OpenJDK8)不完全满足业务需要: 不包含飞行记录功能。只有 OpenJD...

    graf 评论0 收藏0
  • 技术干货 | Docker容器中需要避免十种常见误区

    摘要:第二具备轻量化特性容器的体积非常小巧。他们大多认为自己应该将应用程序部署至当前正在运行的容器当中。不要创建大型镜像体积过大的镜像会加大其发布难度。总体来讲,在向生产环境中部署容器时,必须避免使用最新标签。 当下最火爆的Docker,是一个开源的应用容器引擎。大家已经开始认同并接受容器技术,并意识到它能够解决多种现实问题并具备一系列无可比拟的优势。今天小数就和大家聊一聊容器技术的优势和误...

    Gu_Yan 评论0 收藏0
  • Docker 容器十诫

    摘要:鉴于这一特征,用户必须转变他们使用以及管理容器时的心态。不要将应用分开发布有些人会将容器视为虚拟机,他们中的大部分人认为,应该在现有的运行容器中部署应用。不要以用户运行进程默认情况下,容器以权限运行。 【编者按】本文作者为 Rafael Benevides,主要介绍使用 Docker 容器时应该注意的十个陷阱。文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文。 sho...

    elisa.yang 评论0 收藏0
  • 30 分钟快速入门 Docker 教程

    摘要:分钟快速入门教程一欢迎来到世界与虚拟化在没有的时代,我们会使用硬件虚拟化虚拟机以提供隔离。仓库分为公开仓库和私有仓库,最大的公开仓库是官方仓库,国内的公开仓库也有很多选择,例如阿里云等。 30 分钟快速入门 Docker 教程 一、欢迎来到 Docker 世界 1. Docker 与虚拟化 在没有 Docker 的时代,我们会使用硬件虚拟化(虚拟机)以提供隔离。这里,虚拟机通过在操作系...

    LucasTwilight 评论0 收藏0
  • Docker学习与应用(二)_使用Docker

    摘要:在前一篇文章学习与和应用一初步认识中,我们初步介绍了解决了什么问题,容器化技术与传统的虚拟化方式的区别,以及简要介绍了的几大核心概念镜像容器和仓库。针对上述问题,提供了的,通过使用指令配置的方式来创建镜像。 在前一篇文章 Docker学习与和应用(一)_初步认识中,我们初步介绍了Docker解决了什么问题,Docker容器化技术与传统的虚拟化方式的区别,以及简要介绍了Docker的几大...

    Ocean 评论0 收藏0

发表评论

0条评论

WelliJhon

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<