S2I方式构建docker镜像

S2I方式构建docker镜像

https://www.cnblogs.com/tianshifu/p/8127837.html

https://ywnz.com/linuxyffq/5177.html

https://github.com/openshift/source-to-image

写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脚本,构建镜像(中间)<又称构建器镜像 Builder Image>。
  • 基于上一步生成的镜像(中间),读取源代码,根据S2I脚本定义的步骤编译源代码、部署二进制程序、八戒影院预备服务启动,构建镜像(成品)。

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

S2I脚本介绍

S2I脚本有4种。

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

S2I方式的好处

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

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

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

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

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

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

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

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

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

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

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

 

 

在Linux上安装Source-to-Image(S2I)工具包

mkdir /tmp/s2i/ 
cd /tmp/s2i/ 
curl -s https://api.github.com/repos/openshift/source-to-image/releases/latest | grep browser_download_url | grep linux-amd64 |cut -d '"' -f 4 | xargs wget
tar xvf source-to-image*.gz
sudo mv s2i /usr/local/bin
which s2i
s2i version

 

 

 

 

要引导新的启用S2I的映像存储库,请使用以下命令语法:

#s2i create <image name> <destination directory>
[root@k8s-master s2i]#  mkdir /tmp/s2i-test && cd /tmp/s2i-test
[root@k8s-master s2i-test]#
[root@k8s-master s2i-test]# s2i create cent7-app .
[root@k8s-master s2i-test]# ls
Dockerfile  Makefile  README.md  s2i  test
[root@k8s-master s2i-test]# tree
.
├── Dockerfile
├── Makefile
├── README.md
├── s2i
│   └── bin
│       ├── assemble
│       ├── run
│       ├── save-artifacts
│       └── usage
└── test
    ├── run
    └── test-app
        └── index.html

4 directories, 9 files
[root@k8s-master s2i-test]#

 

S2I制作Nginx镜像

现在我们已经安装了S2I工具,我们可以操作一个简单的例子,说明它如何用于使用应用程序构建你的图像,为简单起见,我们将使用Software Collections S2I存储库,其中包含许多应用程序的预创建模板。

我们的例子是Nginx Web服务器(参考:CentOS 7系统源码安装和配置Nginx服务器),让我们使用Dockerfiles为OpenShift克隆Nginx图像的存储库,你可以在RHEL和基于CentOS的图像之间进行选择:

git clone --recursive https://github.com/sclorg/nginx-container.git
#更改为Nginx版本文件夹:
cd nginx-container
git submodule update --init
cd 1.12

 

 

对于使用其他版本的Nginx,只需在上面的命令中用特定版本替换1.12值。

1、存储库中的文件和目录

 

 

 

在本地拥有存储库后,创建名为nginx-centos7的CentOS 7构建器映像:

docker build -t nginx-centos7 .
# docker images | grep nginx-centos7
nginx-centos7                        latest              a0e59d3bb3c1        About a minute ago   324MB


 

2、创建应用程序映像

应用程序映像将构建器映像与应用程序源代码组合在一起,应用程序源代码使用通过Dockerfile安装的任何应用程序提供,使用汇编脚本编译,并使用运行脚本运行。

可以使用创建的图像作为基础来构建可在Openshift Container平台上运行的简单示例应用程序,以下命令将创建应用程序映像:

[root@k8s-master nginx-container]# ls
1.10  1.12  1.14  1.6  1.8  common  examples  imagestreams  LICENSE  Makefile  README.md  test
[root@k8s-master nginx-container]# cd 1.12/
[root@k8s-master 1.12]# ls
cccp.yml  content_sets.yml  Dockerfile  Dockerfile.fedora  Dockerfile.rhel7  README.md  root  s2i  test
[root@k8s-master 1.12]# s2i build test/test-app nginx-centos7 nginx-centos7-app
---> Installing application source
---> Copying nginx.conf configuration file...
'./nginx.conf' -> '/etc/opt/rh/rh-nginx112/nginx/nginx.conf'
---> Copying nginx configuration files...
'./nginx-cfg/default.conf' -> '/opt/app-root/etc/nginx.d/default.conf'
---> Copying nginx default server configuration files...
'./nginx-default-cfg/alias.conf' -> '/opt/app-root/etc/nginx.default.d/alias.conf'
---> Copying nginx start-hook scripts...
Build completed successfully
[root@k8s-master 1.12]#

 

 

使用汇编脚本中定义的逻辑,s2i现在将使用构建器映像作为基础创建应用程序映像,并包含test/test-app目录中的源代码。

检查以确认你已创建应用程序映像:

# docker images | grep nginx-centos7
nginx-centos7-app                    latest              bc9bfb27d640        40 seconds ago       324MB
nginx-centos7                        latest              a0e59d3bb3c1        2 days ago           324MB

 

 

3、运行应用程序映像

通过调用docker run命令运行应用程序映像:

docker run -d -p 8080:8080 nginx-centos7-app

 

部署的应用程序包含一个简单的静态网页,应该可以从http://localhost:8080访问:

 

# docker run -d -p 8080:8080 nginx-centos7-app
794eb0b7a444ec5b5f9f5b5afaebec7fc69da81047303dde8ad12ebac2617877
# docker ps -a | grep nginx
794eb0b7a444        nginx-centos7-app             "container-entrypoin…"   52 seconds ago      Up 50 seconds               0.0.0.0:8080->8080/tcp, 8443/tcp   heuristic_mclaren
# curl  127.0.0.1:8080
<html>
<head>
        <title>Test NGINX passed</title>
</head>
<body>
<h1>NGINX is working</h1>
</body>
</html>

 

posted on 2019-12-02 10:20  光阴8023  阅读(1333)  评论(0编辑  收藏  举报