使用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

posted @   哈喽哈喽111111  阅读(477)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示