改造前后端分离的jeecg项目部署到k8s中
官網(wǎng)地址:http://www.jeecg.com/
開發(fā)文檔地址:http://doc.jeecg.com/2043873
GitHub地址:https://github.com/zhangdaiscott/jeecg-boot
大致步驟如下:
1.創(chuàng)建MySQL,redis等輔助組件
2.創(chuàng)建jeecg-boot后端應(yīng)用
3.創(chuàng)建jeecg-vue前端應(yīng)用
0.說(shuō)明
1.從GitHub上下載項(xiàng)目的zip壓縮包后,解壓縮可以看到,ant-design-vue-jeecg是前端模塊,jeecg-boot是后端模塊
2.按照開發(fā)文檔上的先在本地配置好前后端所需要的環(huán)境。
3.在k8s中創(chuàng)建一個(gè)jeecg-boot的名稱空間,若無(wú)特別說(shuō)明,以下所有服務(wù)都是在該空間創(chuàng)建的
4.部署流程大致是這樣的,先在本地把前后端都跑通,然后再創(chuàng)建Dockerfile和.gitlab-ci文件,往gitlab提交代碼(事先配置好gitlab-runner),創(chuàng)建鏡像,推送到倉(cāng)庫(kù),自動(dòng)發(fā)布更新到k8s上(首次需要用yaml文件創(chuàng)建有關(guān)pod,service等)
5.我這里采用了倆git倉(cāng)庫(kù),前端一個(gè),后端一個(gè)
1.創(chuàng)建MySQL,redis等輔助組件
說(shuō)白了也就是創(chuàng)建好MySQL服務(wù),redis服務(wù),后端項(xiàng)目中連接需要使用。
我這里采用的是在k8s中創(chuàng)建的,當(dāng)然也可以創(chuàng)建普通的那種應(yīng)用。
以下說(shuō)的都是在k8s中創(chuàng)建舉例的
MySQL和Redis服務(wù),均創(chuàng)建了服務(wù)類型是nodeport的service,然后使用宿主機(jī)上的軟件連接進(jìn)行測(cè)試。等整個(gè)項(xiàng)目跑起來(lái)運(yùn)行后再換成service是clusterip的服務(wù)類型
MySQL創(chuàng)建創(chuàng)建好后,需要導(dǎo)入相應(yīng)的sql文件。
sql文件名稱:jeecg-bootdbjeecgboot-mysql-5.7.sql
但是等后端項(xiàng)目運(yùn)行后會(huì)碰到一個(gè)問(wèn)題,有些數(shù)據(jù)表明是需要大寫的,主要是qrtz開頭的數(shù)據(jù)表名
導(dǎo)入sql文件后,把所有qrtz開頭的數(shù)據(jù)表名全部換成大寫的數(shù)據(jù)表名,避免后端項(xiàng)目啟動(dòng)后連接數(shù)據(jù)庫(kù)提示有些表不存在
最后啟動(dòng)MySQL和Redis服務(wù)。
2.后端項(xiàng)目
0.項(xiàng)目結(jié)構(gòu)
├─jeecg-boot-parent(父POM: 項(xiàng)目依賴、modules組織)
│ ├─jeecg-boot-base(共通模塊: 工具類、config、權(quán)限、查詢過(guò)濾器、注解、接口等)
│ ├─jeecg-boot-module-demo 示例代碼
│ ├─jeecg-boot-module-system (系統(tǒng)管理權(quán)限等功能) -- 默認(rèn)作為啟動(dòng)項(xiàng)目
│ ├─jeecg-boot-starter(微服務(wù)starter模塊,不需要微服務(wù)可以刪掉) (我這邊操作的時(shí)候給刪除了)
│ ├─jeecg-cloud-module(微服務(wù)生態(tài)模塊,不需要微服務(wù)可以刪掉)(我這邊操作的時(shí)候給刪除了)
1.修改項(xiàng)目配置文件(數(shù)據(jù)庫(kù)配置、redis配置)
配置文件: jeecg-boot-module-system/src/main/resources/application-dev.yml
2.啟動(dòng)項(xiàng)目&訪問(wèn)
本地啟動(dòng):jeecg-boot-module-system/src/main/java/org/jeecg/JeecgSystemApplication.java,右鍵執(zhí)行啟動(dòng)。
通過(guò) http://localhost:8080/jeecg-boot/doc.html 訪問(wèn)后臺(tái),默認(rèn)進(jìn)入swagger文檔首頁(yè)
本地運(yùn)行
本地啟動(dòng)后的日志顯示
3.創(chuàng)建Dockerfile文件
需要說(shuō)明的是需要的項(xiàng)目只有jeecg-boot-module-system,所以把Dockerfile文件創(chuàng)建在jeecg-boot-module-system根目錄下
Dockerfile文件具體文件內(nèi)容如下:
FROM jdd.io/jre:1.8.275
MAINTAINER 1103324414@qq.com
ADD target/jeecg-boot-module-system-2.4.3.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar" ]
說(shuō)明:開頭第一行是使用的基礎(chǔ)鏡像,創(chuàng)建方式詳看地址:https://www.cnblogs.com/sanduzxcvbnm/p/13220054.html
基礎(chǔ)鏡像中只有jdk環(huán)境,其他的都沒(méi)有了。
4.創(chuàng)建.gitlab-ci文件
這個(gè)文件創(chuàng)建在整個(gè)項(xiàng)目的根目錄下
需要注意的是gitlab-runner使用的構(gòu)建鏡像環(huán)境,需要包含開發(fā)文檔中說(shuō)的后端項(xiàng)目需要使用的那些軟件。
我這邊圖省事兒,前后端構(gòu)建項(xiàng)目使用的是同一個(gè)構(gòu)建鏡像,包含的軟件就比較多了:jdk,maven,curl,docker,nodejs,yarn等,具體構(gòu)建方式可以看地址:https://www.cnblogs.com/sanduzxcvbnm/p/13220054.html
還有注意的一點(diǎn),jeecg需要使用到一些私服的依賴,詳看地址:http://doc.jeecg.com/2043876
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots,!getui-nexus</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
所以在構(gòu)建剛才的鏡像時(shí),添加的maven需要修改以下settings.xml配置文件。
我這邊采取的方式是事先準(zhǔn)備好已經(jīng)修改好的settings.xml配置文件,然后在構(gòu)建過(guò)程中copy到鏡像中,替換原有的配置文件
FROM alpine:latest
MAINTAINER sandu <1103324414@qq.com>
COPY localtime /etc/localtime
COPY timezone /etc/timezone
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
RUN ["apk","update"]
RUN ["apk","add","curl"]
RUN ["apk","add","openjdk8"]
RUN ["apk","add","maven"]
RUN ["apk","add","nodejs"]
COPY settings.xml /usr/share/java/maven-3/conf/settings.xml
RUN ["apk","add","docker"]
構(gòu)建好這個(gè)鏡像后,修改gitlab-runner使用的鏡像,然后重啟gitlab-runner
注意:不能把這個(gè)鏡像跟后端dockerfile文件中使用的鏡像混為一談,這倆是里面安裝的軟件不一樣
.gitlab-ci.yml文件內(nèi)容如下:
variables:
DOCKER_DRIVER: overlay2
MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
paths:
- .m2/repository/
stages:
- package
- build
maven_step:
tags:
- maven
stage: package
script:
- mvn clean package -Dmaven.test.skip=true # 編譯整個(gè)項(xiàng)目
artifacts:
paths:
- jeecg-boot-module-system/target/*.jar # 注意這行,只要其中一個(gè)jar包,供下面的docker使用
only:
- develop
docker_step:
tags:
- docker
stage: build
script:
- export TAG=`date "+%Y%m%d%H%M%S"`
- docker login -u admin -p admin123 jdd.io
- cd jeecg-boot-module-system
- docker build -t jdd.io/demo:$TAG .
- docker push jdd.io/demo:$TAG
only:
- develop
構(gòu)建的思路如下:先編譯打包整個(gè)項(xiàng)目,然后切換到所需要jar包的目錄下,然后根據(jù)這個(gè)目錄下的Dockerfile文件制作docker鏡像,并上傳到Nexus鏡像倉(cāng)庫(kù),這里指的是jeecg-boot-module-system
流水線上顯示的效果,需要事先配置好gitlab-runner
后期可以在增加上自動(dòng)發(fā)布到k8s上,如下這個(gè)僅供展示,實(shí)際中未操作:(新增加curl一行)
docker_step:
tags:
- docker
stage: build
script:
- export TAG=`date "+%Y%m%d%H%M%S"`
- docker login -u admin -p admin123 jdd.io
- cd jeecg-boot-module-system
- docker build -t jdd.io/demo:$TAG .
- docker push jdd.io/demo:$TAG
- curl -X PUT -H "content-type:application/json" -H "Cookie:KuboardUsername=admin;KuboardAccessKey=4jz66jfsa6t6.5wjsz733f73p5fei4h4fpbmnfp72ytbc" http://192.168.2.163:10080/kuboard-api/cluster/develop/kind/CICDApi/admin/resource/updateImageTag -d '{"kind":"deployments","namespace":"test","name":"web-spring","images":{"jdd.io/demo":"jdd.io/demo:'$TAG'"}}'
only:
- develop
pod啟動(dòng)后的日志展示,里面出現(xiàn)的是pod的地址,因?yàn)閜od的特性,所以訪問(wèn)后端使用的話,還需要?jiǎng)?chuàng)建一個(gè)service,采用clusterip服務(wù)類型
以后訪問(wèn)后端,直接使用ClusterIP+服務(wù)端口的形式就可以了。
當(dāng)然可以先創(chuàng)建service,采用NodePort的服務(wù)類型,然后通過(guò)宿主機(jī)IP+NodePort的形式,直接訪問(wèn)后端應(yīng)用,比如接口文檔,查看以下效果,地址:http://宿主機(jī)IP:NodePort/jeecg-boot/doc.html
3.創(chuàng)建前端
前端最主要的是使用生成的dist文件夾,這里結(jié)合nginx,把兩者直接整個(gè)進(jìn)同一個(gè)鏡像中,這樣一來(lái),啟動(dòng)這個(gè)容器,nginx直接就啟動(dòng)了,nginx訪問(wèn)路徑正好是vue的dist文件夾里面的東西
關(guān)于vue配置文件的說(shuō)明
vue.config.js文件中的配置是在本地開發(fā)的時(shí)候使用的,此處映射地址配置到后臺(tái)端口即可,如果后臺(tái)項(xiàng)目名字修改了的話,直接改“/jeecg-boot”
.env文件是用來(lái)選擇項(xiàng)目構(gòu)建時(shí)使用哪個(gè)配置文件的,主要是有關(guān).env.development和.env.production文件的,這里寫的是哪個(gè),項(xiàng)目采用的就是哪個(gè)配置文件,這里寫的是NODE_ENV=production,說(shuō)明采用的是.env.production文件
3.關(guān)于.env.production文件中的配置
這個(gè)地址應(yīng)該是配置連接后端項(xiàng)目的,也就是后端項(xiàng)目啟動(dòng)后日志中顯示的那個(gè)地址。但是在這里做了特殊的設(shè)置,主要是跟下面的Dockerfile文件中nginx的配置和后期創(chuàng)建的Ingress有關(guān),稍后再詳講解這個(gè)。
直接在前端項(xiàng)目根目錄下創(chuàng)建Dockerfile文件,文件內(nèi)容如下:
# build stage
FROM node:lts-alpine as build-stage # 采用alpine鏡像,多階段構(gòu)建方式
MAINTAINER 1103324414@qq.com
COPY . /app/ # 把跟目錄下所有文件拷貝到上面鏡像的/app目錄下,該目錄不存在的話會(huì)自動(dòng)創(chuàng)建
WORKDIR /app/ # 切換容器中的當(dāng)前工作目錄
RUN npm config set registry https://registry.npm.taobao.org/ && yarn install && yarn run build # 設(shè)置nodejs倉(cāng)庫(kù)源,安裝依賴,打包
# production stage
FROM nginx:stable-alpine as production-stage
# 拷貝dist目錄下的所有文件到/usr/share/nginx/html/目錄下,不包含dist文件夾
COPY --from=build-stage /app/dist /usr/share/nginx/html/
ENV LANG en_US.UTF-8
# 設(shè)置nginx中的配置文件內(nèi)容
RUN echo "server {
listen 80;
location ^~ /jeecg-boot {
proxy_pass http://10.3.255.203:8080/jeecg-boot/;
proxy_set_header Host jeecg-boot-system;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#解決Router(mode: 'history')模式下,刷新路由地址不能找到頁(yè)面的問(wèn)題
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.html?s=$1 last;
break;
}
}
access_log /var/log/nginx/access.log ;
} " > /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
說(shuō)明:
1.nginx.conf文件中沒(méi)有server{}塊,默認(rèn)包含/etc/nginx/conf.d/*.conf, 有個(gè)默認(rèn)的default.conf,這里直接替換默認(rèn)的default.conf了。
2.如下這塊是配置的nginx代理后端模塊的,proxy_pass中寫的地址,端口就是后端項(xiàng)目啟動(dòng)的service服務(wù),ClusterIP+服務(wù)端口,詳看上面的圖
location ^~ /jeecg-boot {
proxy_pass http://10.3.255.203:8080/jeecg-boot/;
proxy_set_header Host jeecg-boot-system;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
然后創(chuàng)建.gitlab-ci.yml文件,具體內(nèi)容如下:
variables:
DOCKER_DRIVER: overlay2
MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
key: ${CI_BUILD_REF_NAME}
paths:
- node_modules/
stages:
- build
docker_step:
tags:
- docker
stage: build
script:
- export TAG=`date "+%Y%m%d%H%M%S"`
- docker build -t jdd.io/jeecg-vue:$TAG .
- docker login -u admin -p admin123 jdd.io
- docker push jdd.io/jeecg-vue:$TAG
- curl -X PUT -H "content-type:application/json" -H "Cookie:KuboardUsername=admin;KuboardAccessKey=hx35mfx3b7p6.w6wm38cbikdd4yeweexfcsfybd4zmk2s" http://192.168.2.163:10080/kuboard-api/cluster/develop/kind/CICDApi/admin/resource/updateImageTag -d '{"kind":"deployments","namespace":"jeecg","name":"my-vue","images":{"jdd.io/jeecg-vue":"jdd.io/jeecg-vue:'$TAG'"}}'
only:
- develop
構(gòu)建的思路如下:直接根據(jù)這個(gè)目錄下的Dockerfile文件制作docker鏡像,并上傳到Nexus鏡像倉(cāng)庫(kù),然后自動(dòng)更新到k8s中(需要事先使用yaml文件創(chuàng)建好對(duì)應(yīng)的pod,下面會(huì)講述)
檢查方式是登錄進(jìn)入,查看nginx是否啟動(dòng),若啟動(dòng)則說(shuō)明沒(méi)問(wèn)題。
gitlab上使用gitlab-runner自動(dòng)化構(gòu)建的信息如下:
先配置好gitlab-runner(前后端用的是同一個(gè)gitlab-runner)
給前端pod配置一個(gè)service,這里也采用的是服務(wù)類型是ClusterIP的方式,注意,這里的容器端口就是nginx啟動(dòng)后監(jiān)聽的80端口,服務(wù)端口是供下面Ingress域名使用的端口,這里采用80端口,是為了在瀏覽器中輸入域名訪問(wèn)時(shí)不用加端口號(hào)了
然后再配置一個(gè)Ingress,用來(lái)供外部訪問(wèn),這個(gè)域名就是前端訪問(wèn)后端的.env.production配置文件中設(shè)置需要的,本機(jī)電腦上hosts文件需要添加一個(gè)解析
集群中任意一臺(tái)主機(jī)ip都可以
本機(jī)電腦訪問(wèn)的話直接使用瀏覽器打開域名:www.demovue.com就可以了。
問(wèn)題:為啥前端的.env.production配置文件中訪問(wèn)后端的地址需要配置域名,而不是直接配置后端的svc ip地址?
一開始確實(shí)是這樣配置的,但是在登錄頁(yè)面需要輸入驗(yàn)證碼,這個(gè)驗(yàn)證碼是從后端獲取的,但是此時(shí)客戶端是本機(jī)瀏覽器,不是vue, 瀏覽器中驗(yàn)證碼訪問(wèn)的地址是svc ip地址,這肯定是訪問(wèn)不通的
同時(shí)結(jié)合nginx配置考慮,訪問(wèn)后端是通過(guò)nginx代理訪問(wèn)的。
以上兩者結(jié)合起來(lái),需要配置域名。
瀏覽器訪問(wèn)vue主頁(yè),vue訪問(wèn)后端的時(shí)候,不是直接訪問(wèn)后端,而是訪問(wèn)后端時(shí)配置的是域名,然后vue又繞道nginx來(lái)訪問(wèn)后端。
4.有關(guān)yaml文件
1.后端
# cat Deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-demo
namespace: jeecg
labels:
app: my-demo
spec:
replicas: 1
selector:
matchLabels:
app: my-demo
template:
metadata:
labels:
app: my-demo
spec:
containers:
- name: my-demo
image: 'jdd.io/demo:20210421194224'
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
resources:
requests:
cpu: 400m
memory: 600Mi
limits:
cpu: 800m
memory: 800Mi
imagePullSecrets:
- name: regcred
# Service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-demo
namespace: jeecg
spec:
type: NodePort
selector:
app: my-demo
ports:
- port: 8080
targetPort: 8080
nodePort: 30080
前端yaml文件
# Deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-vue
namespace: jeecg
labels:
app: my-vue
spec:
replicas: 1
selector:
matchLabels:
app: my-vue
template:
metadata:
labels:
app: my-vue
spec:
containers:
- name: my-vue
image: jdd.io/jeecg-vue:20210421232150
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
requests:
cpu: 400m
memory: 600Mi
limits:
cpu: 800m
memory: 800Mi
imagePullSecrets:
- name: regcred
# Service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-vue
namespace: jeecg
spec:
type: ClusterIP
selector:
app: my-vue
ports:
- port: 80
targetPort: 80
# Ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
labels:
app: my-demo
k8s.kuboard.cn/name: my-demo
name: my-demo
namespace: jeecg
spec:
rules:
- host: www.demovue.com
http:
paths:
- backend:
serviceName: my-demo
servicePort: 80
path: /
最終效果
問(wèn)題
1.構(gòu)造出來(lái)的docker鏡像太大
后端鏡像有500多M,前端鏡像有39.3M
從后端Dockerfile文件入手,逐步排查
首先使用的FROM基礎(chǔ)鏡像,這個(gè)基礎(chǔ)鏡像只是用來(lái)提供java運(yùn)行環(huán)境的,只要jre就可以,沒(méi)必要用jdk
改造文章參考:https://www.cnblogs.com/sanduzxcvbnm/p/13220054.html
先運(yùn)行依賴鏡像:
docker run -it alpine:latest
替換里面的鏡像源文件,更新:
echo "https://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories
echo "https://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
apk update
然后搜索jdk
apk search jdk
通過(guò)觀察發(fā)現(xiàn)java8的有好多個(gè)。
逐個(gè)安裝排查
先安裝openjdk8-jre
apk add openjdk8-jre
通過(guò)觀察,安裝openjdk8-jre的同時(shí)也會(huì)安裝openjdk8-jre-lib和openjdk8-jre-base,結(jié)果是:OK: 106 MiB in 61 packages
卸載openjdk8-jre,安裝openjdk8
apk del openjdk8-jre
apk add openjdk8
通過(guò)觀察可以得知,安裝openjdk8的同時(shí),也會(huì)安裝openjdk8-jre,openjdk8-jre-lib和openjdk8-jre-base。結(jié)果是:OK: 125 MiB in 62 packages
最終采用安裝openjdk8-jre來(lái)構(gòu)建Dockerfile文件中的基礎(chǔ)鏡像 (# alpine中安裝軟件默認(rèn)是沒(méi)有開啟緩存的,所以裝完也不用清緩存)
FROM alpine:latest
MAINTAINER sandu <1103324414@qq.com>
COPY localtime /etc/localtime
COPY timezone /etc/timezone
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
RUN ["apk","update"]
RUN ["apk","add","openjdk8-jre"]
制作基礎(chǔ)鏡像:
docker build -t jdd.io/jre:1.8.0_275 -f Dockerfile_alpine .
制作后的鏡像大小112MB,基本上是達(dá)到要求
若是還想進(jìn)一步降低大小的話,只能安裝openjdk8-jre較低版本的了。
因?yàn)槲募?etc/apk/repositories采用的是alpine的最新鏡像庫(kù)文件,所以只有1.8.0_275這一個(gè)最新版本。
想要安裝低版本的,首先查看網(wǎng)站http://mirrors.aliyun.com/alpine/中各個(gè)不同的alpine版本鏡像,找到所需要安裝的那個(gè)jre1.8版本,使用這個(gè)版本的鏡像源,然后再安裝,這里就不在操作了。
然后使用后端的Dockerfile文件制作鏡像,最后得到的鏡像大小如下:
以上步驟都是單獨(dú)操作獲取的數(shù)據(jù),在gitlab上使用gitlab-runner構(gòu)建編譯查看得知,后端鏡像大小是252MB。之前相比,鏡像大小減小了一半多。
前端鏡像,單獨(dú)編譯出的dist目錄有17M,再加上使用的nginx鏡像:nginx:stable-alpine ,有22.6MB
這兩者加一塊兒大約有39.6M,比開頭說(shuō)的39.3M多了0.3M, 所以前端使用的鏡像沒(méi)必要精簡(jiǎn)
2.增加使用使用服務(wù)狀態(tài)探針進(jìn)行健康檢查
Dockerfile文件中需要用EXPOSE暴露端口
參考文章:https://www.cnblogs.com/sanduzxcvbnm/p/14710189.html
3.首頁(yè)訪問(wèn)慢
開啟Nginx壓縮,解決前端訪問(wèn)慢問(wèn)題,官方文檔:http://doc.jeecg.com/2043891
項(xiàng)目中采用的是nginx和vue的dist打包在一起,nginx配置文件沒(méi)有從中分離出來(lái),這里采用得方式是在原有Dockefile文件基礎(chǔ)上修改默認(rèn)得nginx.conf文件
4.前端Dockerfile文件整理
可以試著把yarn install && yarn build的功能放在.gitlab-ci.yml文件中來(lái)執(zhí)行,順便打包dist文件夾供下載,并且提供到下一步docker鏡像使用
若是這樣的話,Dockerfile文件中也可以把nginx配置文件nginx.conf和default.conf給單獨(dú)提出來(lái),使用的時(shí)候COPY進(jìn)去?;蛘咧苯影裠efault.conf中內(nèi)容給整合進(jìn)nginx.conf中。
這樣一來(lái)gitlab-runner使用的基礎(chǔ)鏡像還得修改,增加安裝nodejs和yarn,通過(guò)查看,安裝的兩者版本vue前端項(xiàng)目的要求
不過(guò)經(jīng)檢查后發(fā)現(xiàn),安裝的nodejs并沒(méi)有npm命令,所以還得再安裝npm.
然后更換gitlab-runner使用的鏡像
接下來(lái)是創(chuàng)建nginx.conf文件,整合進(jìn)default.conf文件的內(nèi)容,先.gitlab-ci.yml文件,確保vue編譯成功dist目錄后打包壓縮,供下一步的Dockerfile文件文件使用
gitlab上實(shí)際操作信息如下:
接下來(lái)修改Dockerfile文件內(nèi)容
需要注意的是牽涉到把上一步的壓縮包dist.tar.gz整合到鏡像中來(lái),所以壓縮包dist.tar.gz怎么壓縮是有講究的
1.若是壓縮包解壓后是一個(gè)dist文件夾,那么nginx.conf文件就得修改,root /usr/share/nginx/html/;就得換成root /usr/share/nginx/html/dist/;
2.若是壓縮包解壓后是dist文件夾下的內(nèi)容,不包含dist文件夾,則Dockerfile文件和nginx.conf文件都不用修改
這里采用的是第二種方法,所以.gitlab-ci.yml文件關(guān)于制作壓縮包還得再次修改一下
variables:
DOCKER_DRIVER: overlay2
cache:
key: ${CI_BUILD_REF_NAME}
paths:
- node_modules/
stages:
- package
- build
yarn_step:
tags:
- yarn
stage: package
script:
- npm config set registry https://registry.npm.taobao.org/
- yarn install
- yarn build
- cd dist && tar -zcvf ../dist.tar.gz * # 打包整個(gè)dist文件(包含目錄dist)和打包dist下的文件(不包含目錄dist)跟DOckerfile文件中ADD有關(guān),進(jìn)而影響到nginx.conf文件
artifacts:
paths:
- dist.tar.gz
only:
- develop
docker_step:
tags:
- docker
stage: build
script:
- export TAG=`date "+%Y%m%d%H%M%S"`
- docker build -t jdd.io/jeecg-vue:$TAG .
- docker login -u admin -p admin123 jdd.io
- docker push jdd.io/jeecg-vue:$TAG
# - curl -X PUT -H "content-type:application/json" -H "Cookie:KuboardUsername=admin;KuboardAccessKey=4jz66jfsa6t6.5wjsz733f73p5fei4h4fpbmnfp72ytbc" http://192.168.2.163:10080/kuboard-api/cluster/develop/kind/CICDApi/admin/resource/updateImageTag -d '{"kind":"deployments","namespace":"test","name":"web-spring","images":{"jdd.io/demo":"jdd.io/demo:'$TAG'"}}'
- curl -X PUT -H "content-type:application/json" -H "Cookie:KuboardUsername=admin;KuboardAccessKey=hx35mfx3b7p6.w6wm38cbikdd4yeweexfcsfybd4zmk2s" http://192.168.2.163:10080/kuboard-api/cluster/develop/kind/CICDApi/admin/resource/updateImageTag -d '{"kind":"deployments","namespace":"jeecg","name":"my-vue","images":{"jdd.io/jeecg-vue":"jdd.io/jeecg-vue:'$TAG'"}}'
only:
- develop
Dockerfile文件內(nèi)容
COPY命令會(huì)覆蓋源文件,ADD命令會(huì)把壓縮包dist.tar.gz自動(dòng)解壓縮到/usr/share/nginx/html/ (不含dist文件夾)
FROM nginx:stable-alpine
MAINTAINER 1103324414@qq.com
COPY nginx.conf /etc/nginx/nginx.conf
ADD dist.tar.gz /usr/share/nginx/html/
ENV LANG en_US.UTF-8
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
nginx.conf文件內(nèi)容如下
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 65535;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
server_tokens off;
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6].";
# include /etc/nginx/conf.d/*.conf;
server {
listen 80; # 注意:不加域名
location ^~ /jeecg-boot {
proxy_pass http://10.3.255.203:8080/jeecg-boot/; # 使用的是后端SVC cluster ip
proxy_set_header Host jeecg-boot-system;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#解決Router(mode: 'history')模式下,刷新路由地址不能找到頁(yè)面的問(wèn)題
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.html?s=$1 last;
break;
}
}
access_log /var/log/nginx/default_access.log main;
}
}
最終效果
制作出來(lái)的前端鏡像大小還是跟原來(lái)的一樣,39.3M
用瀏覽器訪問(wèn)網(wǎng)址:http://www.demovue.com進(jìn)行測(cè)試,可以明顯感覺(jué)到頁(yè)面打開速度加快了好多
總結(jié)
以上是生活随笔為你收集整理的改造前后端分离的jeecg项目部署到k8s中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: apache安装教程详解_Apache安
- 下一篇: IntelliJ IDEA(简称IJ)建