1、基礎鏡像制作
由於公司的程序是Java開發,上線發布使用的是maven,如果使用openshift自帶的S2I,每次都會全量拉取代碼(代碼比較多,每次全量拉太慢),然后每次打包都會再一次下載maven插件,官方也有save-artifacts的方法,貌似是保存編譯的產物,但是我沒有研究成功,所以就用了制作鏡像的笨方法進行一些基礎環境的搭建。

[root@master1 dockerfile]# cat Dockerfile # There is a base Dockerfile # Version 1.0 # Auther is Dukuan FROM centos:6 MAINTAINER Du Kuan ADD ./apache-maven-3.0.5.tar.gz /usr/local/ ADD ./jdk1.8.0_144.tar.gz /usr/local ADD ./apache-tomcat-8.5.23.tar.gz /tmp ADD ./key.tar.gz /tmp ADD ./data.tar.gz / RUN useradd -m tomcat -u 1001 && mkdir /home/tomcat/{.ssh,git} && mkdir /data01 && chown -R tomcat.tomcat /data* && mv /tmp/apache-tomcat-8.5.23 /home/tomcat/ && mv /tmp/id_dsa /home/tomcat/.ssh && mv /tmp/known_hosts /home/tomcat/.ssh && yum install git -y && chown -R tomcat.tomcat /home/tomcat/ && chmod -R a+rw /home/tomcat && chmod a+rwx /home/tomcat/apache-tomcat-8.5.23/* && chmod +x /home/tomcat/apache-tomcat-8.5.23/bin/*.sh && yum clean all && chmod 600 /home/tomcat/.ssh/id_dsa && su - tomcat -c "cd /home/tomcat/git && git clone git@192.168.1.212:server/walrus-platform.git" ENV JAVA_HOME=/usr/local/jdk1.8.0_144 ENV PATH=/usr/local/apache-maven-3.0.5/bin:${JAVA_HOME}/bin:${PATH} USER 1001 # WORKDIR /home/tomcat/git # RUN git clone git@192.168.1.212:server/walrus-platform.git WORKDIR /home/tomcat/git/walrus-platform RUN git checkout develop-feature-4.1-optimiz && mvn compile package -Dmaven.test.skip=true -Ptesting && mvn clean USER 0
上面的Dockerfile包括拉取全量代碼到Tomcat家目錄下(公司使用的都是Tomcat用戶),然后進行Maven打包,下載對應的插件,最后在clean,然后生成的鏡像作為S2I的基礎鏡像。
執行構建
docker build -t xxx:xxx .
2、安裝S2I
安裝比較簡單,在https://github.com/openshift/source-to-image/releases下載最新版S2I。
tar xf source-to-image-v1.1.9a-40ad911d-linux-amd64.tar.gz -C /usr/bin/
檢驗安裝

[root@master1 bin]# s2i version s2i v1.1.9a [root@master1 bin]#
3、創建S2I
創建一個名為tomcat-s2i的S2I Builder鏡像。第三個參數為工作目錄的名稱。

[root@openshift-master1]s2i create tomcat-s2i tomcat-s2i [root@openshift-master1 tomcat-s2i]# ls Dockerfile Makefile README.md s2i test
4、修改S2I的Dockerfile
由於已經制作了基礎鏡像,所以S2I的Dockerfile只需要將FROM改為上述創建的鏡像即可。

# walrus-platform FROM xxx:xxx 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" COPY ./s2i/bin/ /usr/libexec/s2i RUN chown -R tomcat.tomcat /usr/libexec/s2i && chmod +x /usr/libexec/s2i/bin/* USER 1001 # 端口 EXPOSE 8080 ENTRYPOINT [] CMD ["usage"]
5、修改S2I的assemble
assemble主要寫一些編譯的參數或命令,主要用於寫重構的步驟,由於上述采用的定制的基礎鏡像,並將全部代碼放到了Tomcat下,所以直接在Tomcat的家目錄下進行操作,忽略openshift自帶的build,相當於欺騙了openshift,用於避免每次全量拉取代碼和每次重構下載插件。

#!/bin/bash -e # # S2I assemble script for the 'walrus' 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 'walrus' 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 application source..." echo "+++++++++++++++++++++++${POM_ENV}++++++++++++++" # WORKDIR on xxx now mvn compile package -Dmaven.test.skip=true -P${POM_ENV} find . -type f -name "*${WAR_NAME}*" | xargs -i cp {} /home/tomcat/apache-tomcat-8.5.23/webapps mvn clean rm -rf ./* echo "---> Building application from source..." # TODO: Add build steps for your application, eg npm install, bundle install, pip install, etc.
6、修改S2I的run
此文件主要寫容器啟動后需要執行的命令,我公司的就是啟動Tomcat。

#!/bin/bash -e # # S2I run script for the 'walrus-platform' image. # The run script executes the server that runs your application. # # For more information see the documentation: # https://github.com/openshift/source-to-image/blob/master/docs/builder_image.md # /home/tomcat/apache-tomcat-8.5.23/bin/startup.sh tail -f /home/tomcat/apache-tomcat-8.5.23/logs/catalina.out
7、執行構建
通過執行make進行構建,通過docker images查看生成的鏡像,鏡像名稱即為創建S2I寫的名字
8、導入S2I
由於生成的S2I在本地,它需要能被openshift的所有節點都能下載,所以講它直接push到自己的私有倉庫中,如果沒有私有倉庫,可以使用docker-registry搭建一個簡易的。

yum install docker-registry systemctl start docker-distribution.service systemctl enable docker-distribution.service 修改所有節點Docker配置 [root@master1]# cat /etc/sysconfig/docker # /etc/sysconfig/docker # Modify these options if you want to change the way the docker daemon runs #OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false' OPTIONS=' --selinux-enabled --log-driver=journald --registry-mirror=https://docker.mirrors.ustc.edu.cn --insecure-registry=172.30.0.0/16 --insecure-registry 192.168.10.110:5000'
其中--insecure-registry 192.168.10.110:5000為自己的私有倉庫。
添加tag並push

docker tag walrus-platform 192.168.10.110:5000/xxx docker push 192.168.10.110:5000/xxx
導入鏡像到IS

[root@master1 walrus-platform]# oc project openshift Now using project "openshift" on server "https://master1.xxx.net:8443". [root@master1 walrus-platform]# oc import-image 192.168.10.110:5000/walrus-platform -n openshift --confirm --insecure The import completed successfully. Name: walrus-platform Namespace: openshift Created: Less than a second ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2018-03-19T07:14:21Z Docker Pull Spec: docker-registry.default.svc:5000/openshift/walrus-platform Image Lookup: local=false Unique Images: 1 Tags: 1 latest tagged from 192.168.10.110:5000/walrus-platform will use insecure HTTPS or HTTP connections * 192.168.10.110:5000/walrus-platform@sha256:0b963c801da6e40c3a201449c504ab8f605ea8db6054dea6873ac6e80b3c718d Less than a second ago Image Name: walrus-platform:latest Docker Image: 192.168.10.110:5000/walrus-platform@sha256:0b963c801da6e40c3a201449c504ab8f605ea8db6054dea6873ac6e80b3c718d Name: sha256:0b963c801da6e40c3a201449c504ab8f605ea8db6054dea6873ac6e80b3c718d Created: Less than a second ago Image Size: 625 MB (first layer 1.188 kB, last binary layer 70.08 MB) Image Created: 19 minutes ago Author: <none> Arch: amd64 Command: usage Working Dir: /home/tomcat/git/walrus-platform User: 1001 Exposes Ports: 8080/tcp Docker Labels: build-date=20180302 io.k8s.description=Tomcat S2I Builder io.k8s.display-name=tomcat s2i builder 1.0 io.openshift.expose-services=8080:http io.openshift.s2i.scripts-url=image:///usr/libexec/s2i io.openshift.tags=builder, tomcat license=GPLv2 name=CentOS Base Image vendor=CentOS Environment: PATH=/usr/local/apache-maven-3.0.5/bin:/usr/local/jdk1.8.0_144/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin JAVA_HOME=/usr/local/jdk1.8.0_144
9、修改信息
修改注釋讓openshift識別出這個鏡像:
oc edit is/walrus-platform -n openshift
修改如下:
10、查看鏡像
登錄控制台查看: