上一篇文章中我们介绍了如何按照官方文档进行官方容器部署,以及使用官方镜像的坑和限制,这一次我们要采用自主编译代码然后生成镜像进行部署。
首先我们先下载一个官方的网关zip来看一下人家编译好的代码包里都有什么东西以及目录结构是什么样子的。
我下载的是最3.9.0这个是我当时最新的版本,这个包含了所有的四个项目,我们先看网关。
download.gravitee.io/graviteeio-…
网关的目录结构如下:
├── bin
├── config
├── lib
│ └── ext
├── logs
└── plugins
└── ext
└── repository-jdbc
- bin 中存放的是应用的启动脚本
- config中存放了默认的配置文件和logback的配置文件
- lib中存放了项目的所有依赖包
- logs中存放日志文件
- plugins中存放了所有的网关插件,这个很关键,日后我们自定义的插件都要放这
现在我们clone一份官方的代码进行编译,看看得出的效果,注意编译的时候要使用JDK11,我们看一下代码的目录结构,非常多的子项目,在执行maven package之后我们得到了一堆的jar包,但是这个和我们想要的结果相差甚远,所以我们需要自己构造一个和官方一样的目录结构。
为了避免重复的工作,我用上了云效的流水线。
- 1.首先我们需要编译源码,然后把里面所有的jar文件复制到lib文件夹下
#要根据自己的实际目录进行编写
mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip
pwd
find ./ -name "gravitee*.jar"
ls
pwd
mkdir target
mkdir target/lib
mkdir target/plugins
mkdir target/ext
mkdir target/config
mkdir target/bin
find ./ -name "gravitee*.jar" -type f -exec cp {} target/lib/ \;
cd target/lib
ls
- 2.我们需要复制一份官方的插件和配置以及启动脚本到对应的文件下,构造和官方一样的目录结构 这里一定要注意复制完之后要核对和官方的结构和文件是否一致,尤其是lib lib/ext这两个文件夹,这里面存放的是网关的所有第三方依赖,一定要和官方的保持一致,直接把官方的复制过来就可以,缺少文件会导致网关无法启动
我们可以看一下,lib下存放的是我们编译完后得到的所有jar包,lib/ext下存放的是这些jar包所需要的外部依赖,这些包非常关键,再三提示,一定不要漏掉。
- 3.接下来我们需要修改一下启动脚本,启动脚本在bin下直接复制过来就可以,文件名gravitee.sh,我们需要在这里面修改一下我们JVM的参数,或者网关一些基本的环境变量的配置,比如配置文件的读取位置也可以在这里修改
- 4.修改完之后,我们需要编写一个Dockerfile进行镜像的编译,我贴一下我的Dockerfile,我用的是红帽IMB的OpenJDK11,这里要注意的是不要用JDK8,因为这个网关是基于11开发的
FROM adoptopenjdk/openjdk11:jre-11.0.11_9-alpine
ENV GRAVITEEIO_HOME /opt/graviteeio-gateway
ENV LANG=C.UTF-8
ENV TZ="Asia/Shanghai"
COPY ./ ${GRAVITEEIO_HOME}
WORKDIR ${GRAVITEEIO_HOME}
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update \
&& apk add --update --no-cache zip unzip netcat-openbsd wget \
&& chgrp -R 0 ${GRAVITEEIO_HOME} \
&& chmod -R g=u ${GRAVITEEIO_HOME}
RUN ls
EXPOSE 8082
RUN chmod 777 ./bin/gravitee
ENTRYPOINT ["./bin/gravitee"]
- 5.使用我们自己构造好的文件结构和dockerfile编译完镜像后,启动容器看一下效果。 JVM参数XMX已经从256变成了2048,并且时区变成了北京时间。