参考《开源容器云Openshift》一书,制作一个Tomcat的S2I镜像(从Git下载代码,Maven打包,部署到Tomcat上。)

从Svn下载代码的S2I镜像可以参考https://github.com/nichochen/openshift-tomcat-svn,这个貌似是《开源容器云Openshift》作者的github项目。

准备环境

  • 在Master上下载S2I的二进制执行文件。
# cd /opt
# wget https://github.com/openshift/source-to-image/releases/download/v1.1.7/source-to-image-v1.1.7-226afa1-linux-386.tar.gz
  • 解压到/usr/bin目录下。
# tar zxvf source-to-image-v1.1.7-226afa1-linux-386.tar.gz -C /usr/bin
  • 通过s2i create命令创建一个名为tomcat-s2i的S2I Builder镜像。第二个参数tomcat-s2i为S2I Builder镜像名称。第三个参数tomcat-s2i-catalog定义了工作目录的名称。
# s2i create tomcat-s2i tomcat-s2i-catalog

执行find tomcat-s2i-catalog查看目录。

s2i目录下为S2I脚本。

其中:

  1. assemble:负责源代码的编译、构建以及构建产出物的部署。
  2. run:S2I流程生成的最终镜像将以这个脚本作为容器的启动命令。
  3. usage:打印帮助信息,一般作为S2I Builder镜像的启动命令。
  4. save-artifacts:为了实现增量构建,在构建过程中会执行此脚本保存中间构建产物。此脚本并不是必需的。

编写Dockerfile

编写一个制作Tomcat的S2I镜像。Dockerfile的内容如下:

# tomcat-s2i
FROM maven:3.3-jdk-7
# TODO: Put the maintainer name in the image metadata
MAINTAINER huliaoliao
# TODO: Rename the builder environment variable to inform users about application you provide them
ENV BUILDER_VERSION 1.0
#TODO: Set labels used in OpenShift to describe the builder image
LABEL io.openshift.s2i.scripts-url=image:///usr/libexec/s2i \io.k8s.description="Tomcat S2I Builder" \io.k8s.display-name="tomcat s2i builder 1.0" \io.openshift.expose-services="8080:http" \io.openshift.tags="builder,tomcat"
WORKDIR /opt
ADD ./apache-tomcat-8.5.5.tar.gz /opt
RUN useradd -m tomcat -u 1001 && \
chmod -R a+rw /opt && \
chmod a+rwx /opt/apache-tomcat-8.5.5/* && \
chmod +x /opt/apache-tomcat-8.5.5/bin/*.sh && \
rm -rf /opt/apache-tomcat-8.5.5/webapps/*
# TODO: Copy the S2I scripts to /usr/libexec/s2i, since maven:3.3-jdk-7 image
# sets io.openshift.s2i.scripts-url label that way, or update that label
COPY ./s2i/bin/ /usr/libexec/s2i
# This default user is created in the image
USER 1001
# TODO: Set the default port for applications built using this image
EXPOSE 8080
ENTRYPOINT []
# TODO: Set the default CMD for the image
CMD ["/usr/libexec/s2i/usage"]

在本Dockerfile中,io.openshift.s2i.scripts-url=image:///usr/libexec/s2i标签指定了S2I依赖的脚本所在的路径。S2I执行器将到此路径中查找所需要的执行脚本。

通过USER dev定义了一个新用户,并指定该用户为容器的启动用户。以root用户作为启动用户在某些情况下存在安全风险。

编辑S2I脚本

  • 编辑s2i/bin/assemble脚本(负责源代码的编译、构建以及构建产出物的部署)。

在脚本最末尾添加如下代码:

cp -Rf /tmp/src/. ./
mvn -Dmaven.test.skip=true package
find . -type f -name '*.war'|xargs -i cp {} /opt/apache-tomcat-8.5.5/webapps/
mvn clean

这段代码会触发一次Maven构建,并将构建产生的WAR包拷贝到Tomcat服务器的webapps目录下进行部署。
完整的assemble脚本如下:

#!/bin/bash -e
#
# S2I assemble script for the 'tomcat-s2i' image.
# The 'assemble' script builds your application source so that it is ready to run.
#
# For more information refer to the documentation:
#       https://github.com/openshift/source-to-image/blob/master/docs/builder_image.md
#
# If the 'tomcat-s2i' assemble script is executed with the '-h' flag, print the usage.
if [[ "$1" == "-h" ]]; thenexec /usr/libexec/s2i/usage
fi
# Restore artifacts from the previous build (if they exist).
#
if [ "$(ls /tmp/artifacts/ 2>/dev/null)" ]; thenecho "---> Restoring build artifacts..."mv /tmp/artifacts/. ./
fi
echo "---> Installing application source..."
cp -Rf /tmp/src/. ./
echo "---> Building application from source..."
# TODO: Add build steps for your application, eg npm install, bundle install, pip install, etc.
mvn -Dmaven.test.skip=true package
find . -type f -name '*.war'|xargs -i cp {} /opt/apache-tomcat-8.5.5/webapps/
mvn clean
  • 编辑s2i/bin/run脚本(S2I流程生成的最终镜像将以这个脚本作为容器的启动命令)。

替换为以下内容:

bash -c "/opt/apache-tomcat-8.5.5/bin/catalina.sh run"

脚本内容为启动Tomcat服务器。

执行镜像构建

  • 下载对应版本的Tomcat安装包。
[root@master tomcat-s2i-catalog]# wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.5/bin/apache-tomcat-8.5.5.tar.gz
  • 构建镜像。s2i create命令为用户生成了一个Makefile,通过make指令可以启动Docker build。
[root@master tomcat-s2i-catalog]# make

导入镜像

  • 将tomcat-s2i镜像推送到自己的镜像仓库。

此步省略。

  • 将tomcat-s2i镜像导入Openshift中生成相应的Image Stream。
# oc import-image master.example.com:5000/tomcat-s2i -n openshift --confirm --insecure

导入openshift项目里,以便该Image Stream可以被其他项目引用。

  • 查看导入的Image Stream。
# oc get is -n openshift

为了让OpenShift识别出这个镜像是S2I的Builder镜像,需要编辑刚导入的Image Stream,添加注解“tags”

# oc edit is/tomcat-s2i -n openshift

主要是修改annotations下的内容,如红框所示,这里只是简单的添加。

修改完成后保存退出。

验证

登录web console,我的web console中已有新创建的镜像。

构建成功。

openshift/origin学习记录(9)——S2I镜像定制(基于Git)相关推荐

  1. openshift/origin学习记录(12)——离线安装集群

    最近在公司申请了三台云主机,并在这三台云主机上搭建openshift集群.由于公司的云主机是内网环境,无法连接外网,所以需要离线安装.记录过程如下: 搭建本地yum服务器 在之前在线安装的opensh ...

  2. openshift/origin工作记录(9)——openshift结合jenkins实现持续集成

    最近工作为基于jenkins.Openshift实现持续集成. 由于只给了我一周的时间,这里先记录一下V1.0版的实现过程. 集成jenkins 参考<openshift/origin学习记录( ...

  3. openshift/origin工作记录(8)——docker镜像垃圾回收

    镜像仓库垃圾回收 master节点上以集群管理员登录集群后执行: # oadm prune images --all=false --keep-younger-than=0m --keep-tag-r ...

  4. 席裕庚《预测控制》学习记录 (一)-基于阶跃响应的动态矩阵控制(DMC)包含仿真

    本文除了黑体部分均为<预测控制>一书中的知识点,感觉像之前的ADRC只放个仿真不太好,就把原理也写上了 简介 模型预测控制(Model Predictive Control,MPC),或简 ...

  5. 学习记录-Linux图形栈:基于DRM和Wayland

    基本概念 1.Wayland:显示服务器,是一种协议 2.Weston:是Wayland协议的的实现 3.drm又包括: drm framebuffer:它是一块内存区域,我把它理解为一块画布,驱动和 ...

  6. github学习记录

    github学习记录 引言 1.安装及初始化git 2.新建仓库 3.clone仓库 4.已存在仓库 5.从github上下载部分文件 5.打标签 6.常见问题 7.合并分支 8.commit 格式 ...

  7. 【转】BLE 学习记录

    原文网址:http://m.blog.csdn.net/blog/chiooo/43985401 BLE 学习记录 ANROID BLE 开发,基于 bluetoothlegatt 分析 mBluet ...

  8. 三维荧光学习记录--在Origin中绘制三维荧光光谱图(补充)及荧光区域积分(FRI)

    三维荧光学习记录–在Origin中绘制三维荧光光谱图(补充)及荧光区域积分(FRI) 注:本文仅作为自己的学习记录以备以后复习查阅 关于区域积分的简介,大家可以去看我之前的文章,这里就不赘述了,主要想 ...

  9. 海思3518ev200学习记录(1)- 根据用户手册烧录系统镜像

    系列文章目录 海思3518ev200学习记录(1)- 根据用户手册烧录系统镜像 海思3518ev200学习记录(2) - 交叉编译官方webRTC 海思3518ev200学习记录(3) - 编译 am ...

最新文章

  1. RabbitMQ持久化交换机队列
  2. 【CyberSecurityLearning 24】kali中间人攻击
  3. 基于Ameoba实现mysql读写分离
  4. CF613D Kingdom and its Cities
  5. 机器学习偏差方差_机器学习101 —偏差方差难题
  6. 手动挡五个档位示意图_汽车档位越多越好?听听专业回答
  7. STL源码剖析 关联式容器 树 红黑树、二叉搜索树、平衡二叉搜索树
  8. 使用Docker启动Kafka-Manager
  9. 从ini文件里面读取配置文件
  10. 电力装置的继电保护和自动装置设计规范_继电保护装置升级到微机保护装置
  11. BZOJ 2288: 【POJ Challenge】生日礼物 优先队列+贪心+链表
  12. 目前8岁女儿上的课程
  13. mysql避免死锁的方法
  14. Zabbix 结合 bat 脚本实现多个应用程序状态监控
  15. PHP MVC 组件 Medoo、Slim、Twig和Composer
  16. 读《微波工程(第三版)》笔记 (零:介绍)
  17. Python三种设计模式
  18. 两侧广告HTML,jquery实现两边飘浮可关闭的对联广告
  19. 虚拟机安装CentOS6.5报错:Hardware Unsupported detected问题的解决
  20. setBounds()和setSize的区别

热门文章

  1. 深入学习jquery源码之高德地图组件的使用
  2. imag.js|快速掌握全局方法
  3. 3月4日 与柳传志面对面(谁是这个时代的思想家)
  4. js html游戏仿写,天猫首页天猫超市下的选项卡(加自动轮播效果)仿写(js加jquery实现动态效果)...
  5. 内推 | 【国企】中国人寿-数据管理与数据分析/成都
  6. 新起点,新希望,为梦想而战!!!
  7. Proxmox——虚拟机使用
  8. Ubuntu18.04启动盘制作
  9. 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径, 使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。
  10. kaggle上面的E-Commerce Data数据集练习(数据处理)