参考《开源容器云Openshift》一书,制作一个Tomcat的S2I镜像(从Git下载代码,Maven打包,部署到Tomcat上。)
从Svn下载代码的S2I镜像可以参考https://github.com/nichochen/openshift-tomcat-svn,这个貌似是《开源容器云Openshift》作者的github项目。
# 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
# tar zxvf source-to-image-v1.1.7-226afa1-linux-386.tar.gz -C /usr/bin
# s2i create tomcat-s2i tomcat-s2i-catalog
执行find tomcat-s2i-catalog
查看目录。
s2i目录下为S2I脚本。
其中:
编写一个制作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用户作为启动用户在某些情况下存在安全风险。
在脚本最末尾添加如下代码:
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" ]]; 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..."
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
替换为以下内容:
bash -c "/opt/apache-tomcat-8.5.5/bin/catalina.sh run"
脚本内容为启动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
[root@master tomcat-s2i-catalog]# make
此步省略。
# oc import-image master.example.com:5000/tomcat-s2i -n openshift --confirm --insecure
导入openshift项目里,以便该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中已有新创建的镜像。
构建成功。