s2i簡(jiǎn)介

s2i原理

s2i是紅帽推出的一種基于容器的應(yīng)用鏡像構(gòu)建工具患久。它需要三個(gè)元素:源碼,基礎(chǔ)鏡像示启,構(gòu)建配置兢哭。大概流程如下:

  1. 首先用戶需要制作一個(gè)基礎(chǔ)鏡像,作為構(gòu)建的基礎(chǔ)環(huán)境夫嗓,用戶需要配置好相應(yīng)的軟件包迟螺,環(huán)境變量,等等
  2. s2i負(fù)責(zé)啟動(dòng)一個(gè)容器(其鏡像為用戶指定的基礎(chǔ)鏡像)
  3. s2i將源碼拉取到容器中的/tmp/src目錄下舍咖,然后讀取s2i的配置信息進(jìn)行源碼編譯及安裝配置
  4. s2i將編譯好的容器提交成新的鏡像

s2i配置文件信息

主要包含四個(gè)文件矩父,分別為:

  1. assemble 用于對(duì)源碼編譯以及安裝配置的腳本
  2. run 啟動(dòng)應(yīng)用鏡像時(shí)執(zhí)行的腳本
  3. save-artifacts 用于保存一些編譯中復(fù)用的內(nèi)容,這樣下次編譯可以直接使用這些文件排霉,從而加快編譯安裝等速度
  4. usage 打印生成鏡像的幫助信息

這四個(gè)文件都需要用戶自行定義浙垫,s2i會(huì)通過(guò)三種方式尋找這些文件,分別為:

  • 源碼中.s2i/bin下
  • --scripts-url 參數(shù)指定的位置
  • 鏡像中l(wèi)abel:io.openshift.s2i.scripts-url指定的位置

推薦使用第一種方式郑诺,這樣方便管理和持續(xù)集成夹姥,其他兩種url都支持以下三種形式:

  • image://path_to_scripts_dir 在鏡像內(nèi)的絕對(duì)路徑
  • file://path_to_scripts_dir 在主機(jī)上的絕對(duì)或者相對(duì)路徑
  • http(s)://path_to_scripts_dir 網(wǎng)絡(luò)上的文件

cloudstack在openshift中的部署

由于不同應(yīng)用的配置文件差異很大,所以此處不會(huì)對(duì)配置文件進(jìn)行詳細(xì)解釋辙诞,主要列出主要文件的內(nèi)容辙售。在cloudstack的環(huán)境中中主要包含三臺(tái)cloudstack server和后端的mysql主從數(shù)據(jù)庫(kù),其中需要用到s2i功能的只有cloudstack的編譯飞涂,由于三個(gè)cs server的差別不大旦部,所以使用同一個(gè)鏡像祈搜,通過(guò)環(huán)境變量的不同來(lái)決定是否為主服務(wù)器。

cloudstack服務(wù)部署

cloudstack基礎(chǔ)鏡像

此處直接列出它的Dockerfile

# cloudstack-base
FROM centos:6.6

# TODO: Put the maintainer name in the image metadata
MAINTAINER bdt <bit_bdt@foxmail.com>

# relate url : https://github.com/openshift/source-to-image/blob/master/docs/builder_image.md#required-image-contents

# TODO: Rename the builder environment variable to inform users about application you provide them
ENV BASE_IMAGE_VERSION 1.4

Run yum -y install wget which && yum -y install epel-release && yum -y update && yum -y upgrade \
    && yum install -y ntp && yum -y install java-1.6.0-openjdk \
    && yum -y install mysql mysql-server && yum -y install git svn rpm-build \
    && yum -y install python-setuptools && yum -y install genisoimage \
    && yum -y install java-1.6.0-openjdk-devel tomcat6 ws-commons-util MySQL-python \
    && yum -y clean all

Run yum -y install selinux-policy  libselinux-devel selinux-policy-targeted python-pip &&  yum -y clean all  \
    && pip install --upgrade pip && pip install supervisor \
    && sed -i 's/SELINUX/#SELINUX/g' /etc/selinux/config  && echo "SELINUX=disabled" >> /etc/selinux/config

Run wget https://archive.apache.org/dist/tomcat/tomcat-6/v6.0.35/bin/apache-tomcat-6.0.35.tar.gz \
    && tar xzvf apache-tomcat-6.0.35.tar.gz -C /usr/local \
    && rm -rf apache-tomcat-6.0.35.tar.gz

Run wget http://mirror.cc.columbia.edu/pub/software/apache/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz \
    && tar xzf apache-maven-3.0.5-bin.tar.gz -C /usr/local \
    && cd /usr/local && ln -s apache-maven-3.0.5 maven && rm -rf apache-maven-3.0.5-bin.tar.gz

Run pip uninstall -y meld3 && wget https://pypi.python.org/packages/source/m/meld3/meld3-1.0.2.tar.gz && tar -zxf meld3-1.0.2.tar.gz \
    && cd meld3-1.0.2 && python setup.py install && cd - && rm -f meld3-1.0.2.tar.gz && rm -rf meld3-1.0.2

Run yum -y install gcc && yum -y clean all

ADD repository /root/.m2/repository

s2i配置

前邊所述的四個(gè)文件士八,在本文中主要用到是run和assemble容燕,所以此處只列出它們的內(nèi)容

run

主要執(zhí)行start.sh

sh /tmp/src/.s2i/bin/start.sh

其內(nèi)容如下:

for de in $(losetup -a | grep "cloudstack" | awk -F: '{print $1}'); do losetup -d $de; done;

a=$(losetup -a|wc -l)
mknod /dev/loop$a -m666 b 7 $a
let a++
mknod /dev/loop$a -m666 b 7 $a
losetup -f

#losetup -f
#if [ $? -ne 0 ]; then
#    mknod $(losetup -a | awk -F: 'BEGIN{a=0}  {a++;} END{printf("/dev/loop%d -m666 b 7 %d",a,a)}')
#fi

if [ "$CSM" == "TRUE" ]; then
        cloudstack-setup-databases cloud:password@"$MYSQL_MASTER_SERVICE_HOST"  --deploy-as=root:password
elif [ "$CSM" == "FALSE" ]; then
        cloudstack-setup-databases cloud:password@"$MYSQL_MASTER_SERVICE_HOST"
else
        echo "the value of CSM is not legal"
fi

echo_supervisord_conf > /etc/supervisord.conf
echo -e "[program:cloudstack-setup-management]\ncommand=cloudstack-setup-management" >> /etc/supervisord.conf
supervisord --nodaemon

assemble

#!/bin/bash -e
#
# S2I assemble script for the 'cs-base' 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 'cs-base' assemble script is executed with the '-h' flag, print the usage.
if [[ "$1" == "-h" ]]; then
    exec /usr/libexec/s2i/usage
fi

# Restore artifacts from the previous build (if they exist).
#
if [ "$(ls /tmp/artifacts/ 2>/dev/null)" ]; then
  echo "---> Restoring build artifacts..."
  mv /tmp/artifacts/. ./
fi

echo "---> Installing cloudstack source code..."
#cp -Rf /tmp/src/. ./

echo "---> Building cloudstack from source with args -p noredist... "
# TODO: Add build steps for your application, eg npm install, bundle install, pip install, etc.
pushd /tmp/src/packaging/centos63/
sh package.sh -p noredist
popd


echo "---> move rpms and clean build data..."
cp -r /tmp/src/dist/rpmbuild/RPMS/x86_64/ /root/x86_64/
rm -rf /tmp/src/dist
rm -rf /root/.m2

echo "---> yum localinstall rpms..."

yum -y localinstall /root/x86_64/cloudstack-common-4.3.0*.rpm /root/x86_64/cloudstack-awsapi-4.3.0*.rpm /root/x86_64/cloudstack-management-4.3.0*.rpm

mysql主從配置

mysql master的配置

其dockerfile如下

# cloudstack-base
FROM centos:6.6

# TODO: Put the maintainer name in the image metadata
MAINTAINER bdt <bit_bdt@foxmail.com>

RUN yum -y update && yum install mysql-server -y && yum clean all -y

RUN chkconfig iptables off

COPY start.sh /usr/share/start.sh

RUN chmod 555 /usr/share/start.sh

EXPOSE 3306

CMD sh /usr/share/start.sh && /usr/bin/mysqld_safe

對(duì)應(yīng)的start.sh內(nèi)容如下:

sed -i "/\[mysqld\]/a server-id=1\nlog-bin=mysql-bin\nbinlog-format='ROW'" /etc/my.cnf
service mysqld start \
    && mysql -e \
    "SET PASSWORD = PASSWORD('password'); \
    CREATE USER 'root'@'%' IDENTIFIED BY 'password'; \
    CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; \
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; \
    GRANT REPLICATION SLAVE ON  *.* TO 'repl'@'%' IDENTIFIED BY 'password'; \
    flush privileges;"
service mysqld stop

mysql slave的配置

其dockerfile如下

# cloudstack-base
FROM centos:6.6

# TODO: Put the maintainer name in the image metadata
MAINTAINER bdt <bit_bdt@foxmail.com>

RUN yum -y update && yum install mysql-server -y && yum clean all -y

Run chkconfig iptables off

ADD start.sh /usr/share/start.sh

RUN chmod 555 /usr/share/start.sh

EXPOSE 3306

CMD sh /usr/share/start.sh  && /usr/bin/mysqld_safe

對(duì)應(yīng)的start.sh如下

sed -i "/\[mysqld\]/a server-id=2\nlog-bin=mysql-bin\nbinlog-format = 'ROW'" /etc/my.cnf
service mysqld start
mysql -e \
    "SET PASSWORD = PASSWORD('password'); \
    CREATE USER 'root'@'%' IDENTIFIED BY 'password'; \
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; \
    flush privileges;
    change master to master_host='$MYSQL_MASTER_SERVICE_HOST',master_user='repl',master_password='password';"
service mysqld stop

openshift中部署cloudstack應(yīng)用

具體的yaml文件此處不再展示,可以訪問gitlab中cloudstack項(xiàng)目自行查看

參考鏈接

  1. https://github.com/openshift/source-to-image/blob/master/docs/builder_image.md#required-image-contents
  2. https://blog.openshift.com/create-s2i-builder-image/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婚度,一起剝皮案震驚了整個(gè)濱河市蘸秘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝗茁,老刑警劉巖醋虏,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異哮翘,居然都是意外死亡颈嚼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門饭寺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阻课,“玉大人,你說(shuō)我怎么就攤上這事艰匙∠奚罚” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵旬薯,是天一觀的道長(zhǎng)晰骑。 經(jīng)常有香客問我,道長(zhǎng)绊序,這世上最難降的妖魔是什么硕舆? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮骤公,結(jié)果婚禮上抚官,老公的妹妹穿的比我還像新娘。我一直安慰自己阶捆,他們只是感情好凌节,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洒试,像睡著了一般倍奢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垒棋,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天卒煞,我揣著相機(jī)與錄音,去河邊找鬼叼架。 笑死畔裕,一個(gè)胖子當(dāng)著我的面吹牛衣撬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扮饶,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼具练,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了甜无?” 一聲冷哼從身側(cè)響起扛点,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毫蚓,沒想到半個(gè)月后占键,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昔善,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡元潘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了君仆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翩概。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖返咱,靈堂內(nèi)的尸體忽然破棺而出钥庇,到底是詐尸還是另有隱情,我是刑警寧澤咖摹,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布评姨,位于F島的核電站,受9級(jí)特大地震影響萤晴,放射性物質(zhì)發(fā)生泄漏吐句。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一店读、第九天 我趴在偏房一處隱蔽的房頂上張望嗦枢。 院中可真熱鬧,春花似錦屯断、人聲如沸文虏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)氧秘。三九已至,卻和暖如春趴久,著一層夾襖步出監(jiān)牢的瞬間丸相,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工朋鞍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留已添,地道東北人妥箕。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像更舞,于是被迫代替她去往敵國(guó)和親畦幢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容