2017年3月29日星期三

OpenShift_069:构建 Spring Boot Builder Image(基于 centos7)

环境:MAC OS X 10.12.3 + Docker 1.13.1 + S2I 1.1.5

本文构建一个 spring boot builder image。
以下操作均在 MAC 机器上执行。

1. 创建 S2I 目录结构
s2i create spring-boot-centos7 s2i-spring-boot
说明:这里 spring-boot-centos7 是 builder image 名称,s2i-spring-boot 是目录名称。

2. 下载并解压 jdk 1.8 和 maven 3
tar zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8.0_121 jdk
tar zxvf apache-maven-3.3.9-bin.tar.gz
mv apache-maven-3.3.9 maven

3. 为了能够安装软件,下载 CentOS7 repo
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

4. 定义 Docker file
内容如下:
FROM openshift/base-centos7

EXPOSE 8080

LABEL io.k8s.description="Platform for building and running Spring Boot applications" \
      io.k8s.display-name="Spring Boot Maven 3" \
      io.openshift.expose-services="8080:http" \
      io.openshift.tags="builder,java,java8,maven,maven3,springboot"

COPY CentOS7-Base-163.repo /etc/yum.repos.d/CentOS7-Base-163.repo
RUN yum update -y && \
  yum install -y curl wget git iproute iputils net-tools bash-completion && \
  yum clean all

# 切换镜像的目录,进入 /usr 目录
WORKDIR /usr

# 在 /usr 下创建 java 目录,用来存放 jdk
RUN mkdir java

# 切换镜像的目录至 /usr/java
WORKDIR /usr/java

# 在 /usr/java 下创建 jdk 目录,用来存放 jdk 文件
RUN mkdir jdk

# 切换镜像的目录至 /usr/java/jdk
WORKDIR /usr/java/jdk

# 将宿主机的 jdk 目录下的全部文件考入至镜像的 /usr/java/jdk 目录下
ADD jdk /usr/java/jdk

# 切换镜像的目录至 /usr/share
WORKDIR /usr/share

# 在 /usr/share 下创建 maven 目录,用来存放 maven 文件
RUN mkdir maven

# 将宿主机的 maven 目录下的全部文件考入至镜像的 /opt/face 目录下
ADD maven /usr/share/maven

RUN ln -s /usr/share/maven/bin/mvn /usr/bin/mvn

# 设置时区,容器时间和宿主机时间同步
RUN rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 切换镜像的目录至 /opt/app-root/src
WORKDIR /opt/app-root/src

# 设置环境变量
ENV JAVA_VERSON=1.8.0_121
ENV MAVEN_VERSION=3.3.9
ENV JAVA_HOME=/usr/java/jdk
ENV JAVA_BIN=/usr/java/jdk/bin
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV MAVEN_HOME=/usr/share/maven

# Add configuration files, bashrc and other tweaks
COPY ./s2i/bin/ $STI_SCRIPTS_PATH

RUN chown -R 1001:1001 /opt/app-root
USER 1001

# Set the default CMD to print the usage of the language image
CMD $STI_SCRIPTS_PATH/usage

5. 定义 s2i/bin/assemble
#!/bin/bash

set -e

echo "---> Installing application source"
cp -Rf /tmp/src/. ./

echo "---> Building Spring Boot application from source"
echo "--> # MVN_ARGS = $MVN_ARGS"
if [ -f "mvnw" ]; then
  ./mvnw clean install $MVN_ARGS
else
  mvn clean install $MVN_ARGS
fi

# Fix source directory permissions
fix-permissions ./

6. 定义 s2i/bin/run
#!/bin/bash

set -e

APP_TARGET=${APP_TARGET:-target}
echo "---> Starting Spring Boot application"
echo "--> # APP_TARGET = $APP_TARGET"
echo "--> # JAVA_OPTS = $JAVA_OPTS"
echo "---> Running application from jar ($(find $APP_TARGET -name *.jar)) ..."
java $JAVA_OPTS -jar `find $APP_TARGET -name *.jar`

7. 定义 s2i/bin/usage
#!/bin/sh -e

cat <This is a STI springboot maven3 centos base image:
To use it, install STI: https://github.com/openshift/source-to-image
Sample invocation:
sti build git://github.com/codecentric/springboot-sample-app spring-boot-centos7 springboot-sample-app
You can then run the resulting image via:
docker run -p 8080:8080 springboot-sample-app
EOF

8. 构建 spring boot builder image
make build
或者
docker build -t spring-boot-centos7 .

构建后,启动镜像,检查软件是否都安装了
docker run -it spring-boot-centos7 bash

9. 使用 spring boot builder image 构建应用镜像
s2i build git://github.com/codecentric/springboot-sample-app spring-boot-centos7 springboot-sample-app


这里有一个小问题,就是每次构建应用镜像,都会从网上下载 maven 构件,非常耽误时间。
能不能指向自己私有的 maven 仓库呢?
想一想 maven 的知识,嗯,修改 /usr/share/maven/conf/setting.xml 文件内容。
把本机的 ~/.m2/setting.xml 内容复制过去,
修改这一行,指向镜像中自己的 repository
<localRepository>/opt/app-root/src/.m2/repository</localRepository>
还有别忘了把 localhost 改成 IP 地址,如果有的话。

重新构建 builder image,重新构建应用镜像,这次将会下载到自己私有的 maven 仓库,下次构建应用镜像不用重新下载 maven 构件,速度快了很多!

10. 启动应用镜像
docker run -p 8080:8080 springboot-sample-app

访问 http://localhost:8080



至此,说明 spring boot builder image 构建成功!

参考文献:
1. https://blog.codecentric.de/en/2016/03/deploy-spring-boot-applications-openshift/
2. https://hub.docker.com/r/codecentric/springboot-maven3-centos/
3. https://github.com/codecentric/springboot-maven3-centos
4. https://blog.openshift.com/using-spring-boot-on-openshift/
5. https://blog.openshift.com/using-openshift-enterprise-grade-spring-boot-deployments/

没有评论: