在详细介绍构建器影响之前,我们会先说明一下自定义 S2i 模板的步骤,以及工作原理和构建器镜像的作用。

构建器镜像需要有一些必要的内容才能完成所有工作。

首先由于构建器镜像负责构建应用程序,因此它必须包含构建和运行应用程序所有需要的库和工具。例如 Java 构建器镜像将安装 JDK、Maven等,而 Python 构建器镜像则可能需要 pip 等工具。

其次构建器镜像需要提供脚本来执行构建和运行操作。这部分脚本在 S2I 当中为:

  • assemble - 负责构建应用程序
  • run - 负责运行应用程序

在以下的步骤中,我们将向您展示如何创建一个 服务的构建器镜像。

S2i 命令行工具 带有一个方便的命令,可以引导构建器所需的目录结构。如下安装 S2i CLI:

  1. $ ls
  2. s2i source-to-image-v1.1.14-874754de-linux-386.tar.gz sti
  3. $ cp s2i /usr/local/bin
  1. $ s2i create nginx-centos7 s2i-builder-docs

本文使用 nginx-centos7 作为构建器镜像的名字创建了初始目录,目录结构如下所示。

  1. s2i-builder-docs/
  2. Dockerfile - 一个标准的Dockerfile,定义了构建器镜像。
  3. Makefile - 用于测试和构建构建器镜像的帮助脚本。
  4. test/
  5. run - 测试脚本,测试构建器镜像是否正常工作。
  6. test-app/ - 用于测试的应用程序的目录
  7. s2i/bin
  8. assemble - 负责构建应用程序的脚本
  9. run - 负责运行应用程序的脚本
  10. usage - 负责打印构建器镜像用法的脚本

如下修改 Dockerfile 来定义构建器镜像。

Dockerfile

assemble

  1. #!/bin/bash -e
  2. exec /usr/libexec/s2i/usage
  3. fi
  4. echo "---> Building and installing application from source..."
  5. if [ -f /tmp/src/nginx.conf ]; then
  6. mv /tmp/src/nginx.conf /etc/nginx/nginx.conf
  7. fi
  8. if [ "$(ls -A /tmp/src)" ]; then
  9. fi

默认情况下,s2i build将应用程序源代码放在/tmp/src目录中,在上面的命令当中,我们将应用源代码复制到了了kubespheredev/s2i-base-centos7:1定义的工作目录/opt/app-root/src当中。

现在我们可以来处理第二个脚本 run(用于启动应用程序),在我们的例子当中,它只是启动nginx服务器:

run

  1. #!/bin/bash -e
  2. exec /usr/sbin/nginx -g "daemon off;"

我们使用 exec 命令将执行 run 脚本替换为执行 nginx 服务器的主进程。我们这样做是为了让所有docker发出的信号都可以被 nginx 收到,并且可以让 nginx 使用容器的标准输入和标准输出流。

我们在例子当中被没有实现增量构建,因此我们可以直接删除 save-artifacts 脚本。

最后我们在 usage 脚本当中添加一些使用信息:

usage

  1. #!/bin/bash -e
  2. cat <<EOF
  3. This is the nginx-centos7 S2I image:
  4. To use it, install S2I: https://github.com/kubesphere/s2i-operator
  5. Sample invocation:
  6. s2i build test/test-app kubespheredev/nginx-centos7 nginx-centos7-app
  7. You can then run the resulting image via:
  8. docker run -d -p 8080:8080 nginx-centos7-app
  9. and see the test via http://localhost:8080
  10. EOF

当我们完成了 Dockerfile 和 S2i 的脚本,我们现在修改一下 Makefile 当中的镜像名称:

可以执行 make build 命令来构建我们的构建器镜像了。

  1. $ make build
  2. docker build -t kubespheredev/nginx-centos7-s2ibuilder-sample .
  3. Step 1/17 : FROM kubespheredev/s2i-base-centos7:1
  4. Step 2/17 : LABEL maintainer="Runze Xia <runzexia@yunify.com>"
  5. ---> Using cache
  6. ---> d60ebf231518
  7. Step 3/17 : ENV NGINX_VERSION=1.6.3
  8. ---> Using cache
  9. ---> 5bd34674d1eb
  10. Step 4/17 : LABEL io.k8s.description="Nginx Webserver" io.k8s.display-name="Nginx 1.6.3" io.kubesphere.expose-services="8080:http" io.kubesphere.tags="builder,nginx,html"
  11. ---> Using cache
  12. ---> c837ad649086
  13. Step 5/17 : RUN yum install -y epel-release && yum install -y --setopt=tsflags=nodocs nginx && yum clean all
  14. ---> Running in d2c8fe644415
  15. …………
  16. …………
  17. …………
  18. Step 17/17 : CMD ["/usr/libexec/s2i/usage"]
  19. ---> Running in c24819f6be27
  20. Removing intermediate container c24819f6be27
  21. ---> c147c86f2cb8
  22. Successfully built c147c86f2cb8
  23. Successfully tagged kubespheredev/nginx-centos7-s2ibuilder-sample:latest

可以看到我们的镜像已经构建成功了,现在我们执行 s2i build ./test/test-app kubespheredev/nginx-centos7-s2ibuilder-sample:latest sample app 命令来构建我们的应用镜像。

  1. $ s2i build ./test/test-app kubespheredev/nginx-centos7-s2ibuilder-sample:latest sample-app
  2. ---> Building and installing application from source...
  3. Build completed successfully

当我们完成了应用镜像的构建,我们可以在本地运行这个应用镜像看构建出的应用是否符合我们的要求:

  1. $ docker run -p 8080:8080 sample-app

在浏览器中访问,可以看到我们的网页已经可以正常访问了:

当我们在本地完成 S2I 构建器镜像的测试之后,就可以推送镜像到自定义的镜像仓库当中,并创建构建器模版 yaml 文件:

s2ibuildertemplate.yaml

在创建好构建器模版后我们可以使用 kubectl 将构建器模版提交到 KubeSphere 环境当中:

  1. $ kubectl apply -f s2ibuildertemplate.yaml
  2. s2ibuildertemplate.devops.kubesphere.io/nginx created

现在我们来到 KubeSphere 的控制台界面,我们已经可以选择添加的构建器模版了:

至此我们就完成了 S2i 构建器镜像与构建器模版的创建。类似地,可以参考上述步骤,您可以基于 S2i CLI 自定义任何所需的 S2i 模板,然后在 KubeSphere 构建所需的镜像并一键部署至 Kubernetes 环境中,方便快速与多次构建环境。