使用tini编写Dockerfile文件内容-适用于启动的时候根据shell脚本内容传递使用不同的变量信息
1.Dockerfile文件内容
FROM openjdk:8u371-jre-alpine
ADD preStop.sh run.sh /
RUN chmod 777 /preStop.sh /run.sh
ADD target/test-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["/sbin/tini", "-g", "--"]
CMD ["/bin/sh", "run.sh"]
2.preStop.sh文件内容
作用:获取环境变量信息后,添加钩子,当pod容器下线时,先执行这个钩子,把服务从nacos中下线
注:程序连接nacos需要使用账号和密码,因此需要先获取accessToken
#!/bin/sh
# shell脚本作用
# 在更新pod时先执行这个脚本,把pod应用从nacos中下线,然后再关闭pod
#echo "输出必要的环境变量"
#echo "${NACOS_SERVER_ADDR}"
#echo "${PODNAME}"
#echo "${PODIP}"
#echo "${NACOS_NAMESPACE}"
#echo "${PORT}"
# k8s项目的环境中需要配置的环境变量
# NACOS_SERVER_ADDR,比如:192.168.0.2:8848
# NACOS_USER,访问nacos的用户名
# NACOS_PASSWD,访问nacos的密码
# NACOS_NAMESPACE,比如:default
# PODIP:从容器组中获取,status.PodIP
# 配置k8s项目中的PreStop钩子:['bin/sh','/tmp/preStop.sh']
# 第一次去掉的是随机字符串,第二次去掉的是deployment的名称
#tmp=${HOSTNAME%-*}
#APP_NAME=${tmp%-*}
# 根据用户名和密码获取accessToken
curl -sS -X POST "http://${NACOS_SERVER_ADDR}/nacos/v1/auth/login" -d "username=${NACOS_USER}&password=${NACOS_PASSWD}" > /tmp/tmp.json
# 从返回的json中提取出accessToken
accessToken=`cat /tmp/tmp.json | awk -F ',' '{print $1}' | awk -F ':' '{print $2}' | tr -d '"'`
# 发起服务下线请求
result=$(curl -X PUT "http://${NACOS_SERVER_ADDR}/nacos/v1/ns/instance?accessToken=${accessToken}&serviceName=${APP_NAME}&clusterName=DEFAULT&groupName=DEFAULT_GROUP&ip=${PODIP}&port=${APP_PORT}&enabled=false&namespaceId=${NACOS_NAMESPACE}")
echo "输出curl执行结果result:${result}"
if [ ${result} == "ok" ]; then
echo "执行成功"
sleep 15
exit 0
else
echo "执行失败"
exit 1
fi
3.run.sh文件内容
作用:根据传递进来的不同的环境变量,进行判断,然后拼接组合起来java启动命令
注:当是生产环境时会使用skywalking-agent,其他环境不使用
#!/bin/sh
[ -z ${APP_PORT+x} ]&&APP_PORT=8080
[ -z ${APP_PROFILE+x} ]&&APP_PROFILE=test
[ -z ${APP_NAME+x} ]&&APP_NAME=unknow
if [ "$SERVER_ENV" == "production" ]; then
JAVA_OPTS="-javaagent:/skywalking-agent.jar -Dskywalking.collector.backend_service=skywalking-skywalking-helm-oap.infra:11800 -Dskywalking.agent.service_name=$APP_NAME -Dcsp.sentinel.dashboard.server=sentinel-svc.infra:8080"
else
JAVA_OPTS=""
fi
java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dinstance.id=$RANDOM -jar app.jar --server.port=$APP_PORT --spring.profiles.active=$APP_PROFILE
4.k8s中创建的环境变量,使用secret
供preStop.sh文件使用
5.k8s中yaml文件
使用的是阿里云的流水线
apiVersion: apps/v1
kind: Deployment
metadata:
name: pig-quartz
namespace: {{ .Values.namespace }}
spec:
replicas: 1 #这里写死为1,实际未生效,使用APPStack部署时会覆盖此配置
selector:
matchLabels:
app: pig-quartz
template:
metadata:
name: pig-quartz
labels:
app: pig-quartz
annotations:
prometheus.io/port: "50000" # 不能动态赋值
prometheus.io/path: /actuator/prometheus
prometheus.io/scrape: "true" # 基于pod的服务发现
spec:
volumes:
- name: sls-volumn #sls日志采集使用
emptyDir: {}
terminationGracePeriodSeconds: 45
containers:
- name: app-container
image: {{ .AppStack.image.backend }}
imagePullPolicy: Always
ports:
- containerPort: {{ .Values.port }}
- name: management-port
containerPort: 50000
lifecycle:
preStop:
exec:
command: ["/bin/sh","/preStop.sh"] #在容器被终止前的任务,用于优雅关闭应用程序
resources:
requests:
memory: 2048Mi
limits:
memory: 4096Mi
livenessProbe:
failureThreshold: 3
httpGet:
path: /actuator/health
port: management-port
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 15
successThreshold: 1
failureThreshold: 6
timeoutSeconds: 3
readinessProbe:
failureThreshold: 3
httpGet:
path: /actuator/health
port: management-port
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 15
successThreshold: 1
failureThreshold: 6
timeoutSeconds: 3
env:
- name: APP_NAME
value: "{{ .Values.nacosAppName }}"
- name: APP_PORT
value: "{{ .Values.port }}"
- name: APP_PROFILE
value: "{{ .Values.profile }}"
- name: SERVER_ENV
value: "{{ .AppStack.envName }}"
- name: PODIP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: NACOS_USER
valueFrom:
secretKeyRef:
name: nacos-userinfo
key: username
- name: NACOS_PASSWD
valueFrom:
secretKeyRef:
name: nacos-userinfo
key: password
- name: NACOS_SERVER_ADDR
valueFrom:
secretKeyRef:
name: nacos-userinfo
key: address
- name: NACOS_NAMESPACE
valueFrom:
secretKeyRef:
name: nacos-userinfo
key: namespace
- name: aliyun_logs_{{ .AppStack.envName }}-pig-quartz
value: "/var/log/main.log"
- name: aliyun_logs_{{ .AppStack.envName }}-pig-quartz_project #sls project
value: pig-quartz
- name: aliyun_logs_{{ .AppStack.envName }}-pig-quartz_logstore #sls logstore
value: {{ .AppStack.envName }}-pig-quartz
- name: aliyun_logs_{{ .AppStack.envName }}-pig-quartz_shard #sls shard 数量
value: '1'
- name: aliyun_logs_{{ .AppStack.envName }}-pig-quartz_ttl #日志保存天数
value: '30'
volumeMounts:
- name: sls-volumn
mountPath: /var/log
imagePullSecrets:
- name: harbor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)