light-task-scheduler的dockerfile打包配置

light-task-scheduler是一个分布式定时任务调度框架,功能上类似xxl-job。

项目地址:

github:GitHub - ltsopensource/light-task-scheduler: Distributed Scheduled Job Framework

gitee:light-task-scheduler: 分布式任务调度框架, 支持 实时任务;支持定时任务 (如:3天之后执行);CronExpression 任务(如:0 0/1 * * * ?)

Dockerfile内容如下

# 第一阶段:构建应用
FROM maven:3.6.2-jdk-8 AS builder
WORKDIR /root

# 更新APT源列表
#RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list
#RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com/debian-archive@g" /etc/apt/sources.list
#RUN sed -i "s@http://deb.debian.org@http://archive.debian.org@g" /etc/apt/sources.list
RUN wget -O /etc/apt/sources.list https://static.lty.fun/%E5%85%B6%E4%BB%96%E8%B5%84%E6%BA%90/SourcesList/Debian-9-archive-qcloud.list
RUN apt-get update && \
    apt-get install -y --no-install-recommends zip && \
    rm -rf /var/lib/apt/lists/* \

#旧版debian源参考 https://luotianyi.vc/7428.html

# 应用maven镜像配置
#COPY settings.xml /usr/share/maven/ref/
COPY settings.xml /root/.m2/
# 下载lts源码
RUN wget https://github.com/ltsopensource/light-task-scheduler/archive/refs/tags/1.7.0.tar.gz -O /root/light-task-scheduler-1.7.0.tar.gz
# 复制源代码到容器中
RUN tar -zxf light-task-scheduler-1.7.0.tar.gz

WORKDIR /root/light-task-scheduler-1.7.0

# 替换mysql jdbc驱动版本号 <mysql.version>5.1.26</mysql.version> 改成 <mysql.version>8.0.23</mysql.version>
RUN sed -i "s@<mysql.version>5.1.26</mysql.version>@<mysql.version>8.0.23</mysql.version>@g" pom.xml
# druid.version 需要从1.0.14 改成 1.2.8
RUN sed -i "s@<druid.version>1.0.14</druid.version>@<druid.version>1.2.8</druid.version>@g" pom.xml


# 执行构建命令
RUN sh build.sh

WORKDIR /root/light-task-scheduler-1.7.0/dist

# 执行构建命令
RUN unzip lts-1.7.0-bin.zip


# 第二阶段:部署到jdk8
FROM openjdk:8
WORKDIR /root

# 将lts目录放到app目录
COPY --from=builder /root/light-task-scheduler-1.7.0/dist /root
# 拷贝lts-admin配置
COPY lts-admin.cfg /root/lts-1.7.0-bin/conf
COPY lts-monitor.cfg /root/lts-1.7.0-bin/conf
# 拷贝lts-admin配置
COPY lts-admin.sh /root/lts-1.7.0-bin/bin

WORKDIR /root/lts-1.7.0-bin/bin
# 暴露80端口
EXPOSE 8081
# 启动lts-admin服务
CMD ["sh", "-c", "sh lts-admin.sh start && tail -f /dev/null"]
# Usage: lts-admin.sh {start|stop|restart}

dockerfile用到的文件

settings.xml

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                              http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <mirrors>
        <mirror>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
</settings>

sources.list

# main
deb [check-valid-until=no] http://mirrors.cloud.tencent.com/debian-archive/debian/ stretch main non-free contrib
deb-src [check-valid-until=no] http://mirrors.cloud.tencent.com/debian-archive/debian/ stretch main non-free contrib

# sercurity
#deb http://mirrors.cloud.tencent.com/debian-archive/debian-security/  stretch/updates main contrib non-free
#deb-src http://mirrors.cloud.tencent.com/debian-archive/debian-security/  stretch/updates main contrib non-free

# backports
#deb [check-valid-until=no] http://mirrors.cloud.tencent.com/debian-archive/debian/ stretch-backports main non-free contrib
#deb-src [check-valid-until=no] http://mirrors.cloud.tencent.com/debian-archive/debian/ stretch-backports main non-free contrib

lts-admin.cfg

// 后台的用户名密码
console.username=admin
console.password=admin

# 注册中心地址,可以是zk,也可以是redis
registryAddress=zookeeper://127.0.0.1:2181
# registryAddress=redis://127.0.0.1:6379

# 集群名称
clusterName=test_cluster

# zk客户端,可选值 zkclient, curator
configs.zk.client=zkclient

# ------ 这个是Admin存储数据的地方,也可以和JobQueue的地址一样 ------
configs.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts
configs.jdbc.username=root
configs.jdbc.password=root

# admin 数据使用mysql 默认 mysql, 可以自行扩展
jdbc.datasource.provider=mysql

# 使用 可选值  fastjson, jackson
# configs.lts.json=fastjson

# 是否在admin启动monitor服务, monitor服务也可以单独启动
lts.monitorAgent.enable=true

#======================以下相关配置是JobTracker的JobQueue和JobLogger的相关配置 要保持和JobTracker一样==========================
## (可选配置)jobT. 开头的, 因为JobTracker和Admin可能使用的数据库不是同一个
# LTS业务日志, 可选值 mysql, mongo
jobT.job.logger=mysql
# ---------以下是任务队列配置-----------
# 任务队列,可选值 mysql, mongo
jobT.job.queue=mysql

# ------ 1. 如果是mysql作为任务队列 (如果不配置,表示和Admin的在一个数据库)------
# jobT.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts
# jobT.jdbc.username=root
# jobT.jdbc.password=root

# ------ 2. 如果是mongo作为任务队列 ------
# jobT.mongo.addresses=127.0.0.1:27017
# jobT.mongo.database=lts
# jobT.mongo.username=xxx #如果有的话
# jobT.mongo.password=xxx #如果有的话

# admin 数据使用mysql 默认 mysql, 可以自行扩展
# jobT.jdbc.datasource.provider=mysql

registryAddress configs.jdbc.url configs.jdbc.username configs.jdbc.password 改成自己的

lts-monitor.cfg


# 注册中心地址,可以是zk,也可以是redis
registryAddress=zookeeper://zookeeper:2181
# registryAddress=redis://127.0.0.1:6379

# 集群名称
clusterName=test_cluster

# LTS业务日志, 可选值 mysql, mongo
configs.job.logger=mysql

# zk客户端,可选值 zkclient, curator
configs.zk.client=zkclient

# ---------以下是任务队列配置-----------
# 任务队列,可选值 mysql, mongo
configs.job.queue=mysql

# ------ 1. 如果是mysql作为任务队列 ------
configs.jdbc.url=jdbc:mysql://mysql:3306/lts
configs.jdbc.username=root
configs.jdbc.password=root

# ------ 2. 如果是mongo作为任务队列 ------
configs.mongo.addresses=127.0.0.1:27017
configs.mongo.database=lts
# configs.mongo.username=xxx #如果有的话
# configs.mongo.password=xxx #如果有的话

# admin 数据使用mysql, h2 默认 h2 embedded
jdbc.datasource.provider=mysql

# 使用 可选值  fastjson, jackson
# configs.lts.json=fastjson

registryAddress configs.jdbc.url configs.jdbc.username configs.jdbc.password 改成自己的

 lts-admin.sh

#!/usr/bin/env bash

# JVMFLAGS JVM参数可以在这里设置
JVMFLAGS=-Dfile.encoding=UTF-8

LTS_ADMIN_HOME="${BASH_SOURCE-$0}"
LTS_ADMIN_HOME="$(dirname "${LTS_ADMIN_HOME}")"
LTS_ADMIN_HOME="$(cd "${LTS_ADMIN_HOME}"; pwd)"

if [ "$JAVA_HOME" != "" ]; then
  JAVA="$JAVA_HOME/bin/java"
else
  JAVA=java
fi

#把lib下的所有jar都加入到classpath中
for i in "$LTS_ADMIN_HOME"/../war/jetty/lib/*.jar
do
	CLASSPATH="$i:$CLASSPATH"
done

# echo $CLASSPATH

mkdir -p $LTS_ADMIN_HOME/../logs
mkdir -p $LTS_ADMIN_HOME/../pid

# 转化为绝对路径
CONF_HOME="$LTS_ADMIN_HOME/../."
CONF_HOME=$(cd "$(dirname "$CONF_HOME")"; pwd)
# echo $CONF_HOME

_LTS_DAEMON_OUT="$LTS_ADMIN_HOME/../logs/lts-admin.out"
LTS_MAIN="com.github.ltsopensource.startup.admin.JettyContainer"

LTS_PID_FILE="$LTS_ADMIN_HOME/../pid/lts-admin.pid"

case $1 in
start)
    echo "Starting LTS LTS-Admin ... "
    if [ -f "$LTS_PID_FILE" ]; then
      if kill -0 `cat "$LTS_PID_FILE"` > /dev/null 2>&1; then
         echo $command already running as process `cat "$LTS_PID_FILE"`.
         exit 0
      fi
    fi
    nohup "$JAVA" -Djava.io.tmpdir=/home/work/tmp -cp "$CLASSPATH" $JVMFLAGS $LTS_MAIN "$CONF_HOME" > "$_LTS_DAEMON_OUT" 2>&1 < /dev/null &

	if [ $? -eq 0 ]
    then
      if /bin/echo -n $! > "$LTS_PID_FILE"
      then
        sleep 1
        echo "STARTED"
      else
        echo "FAILED TO WRITE PID"
        exit 1
      fi
    else
      echo "LTS_ADMIN DID NOT START"
      exit 1
    fi
;;
restart)
    sh $0 stop
    sleep 3
    sh $0 start
;;
stop)
    echo "Stopping LTS LTS-Admin  ... "
    if [ ! -f "$LTS_PID_FILE" ]
    then
      echo "no LTS-Admin to started (could not find file $LTS_PID_FILE)"
    else
      kill -9 $(cat "$LTS_PID_FILE")
      rm "$LTS_PID_FILE"
      echo "STOPPED"
    fi
    exit 0
;;
*)
    echo "Usage: $0 {start|stop|restart}" >&2
esac

构建命令

docker build -t lts:1.7.0  .

docker-compose配置

  lts:
    container_name: lts
    image: 'lts:1.7.0'
    ports:
      - '8081:8081'
    volumes:
      - '${PWD}/lts/logs:/root/lts-1.7.0-bin/logs'
    environment:
      - TZ=Asia/Shanghai
    restart: always

可以通过logs看到访问地址

如果是curl测试 需要加上-u

curl -uadmin localhost:8081/index.htm

之后按提示输入密码得到首页的返回结果

不得不说,这次配置坑太多了,踩坑如下

1.lts的打包脚本,win打包的是目录,linux打包的是zip包,最开始dockerfile照着windows写根本出不来结果

2.debian旧版镜像源配置问题,说到底还是国内企业环境用debian的少,旧版镜像的配置文章少之又少。centos的旧版源配置搜一搜就有。

3.lts的mysql驱动升级问题。旧版用的5驱动,但是现在mysql大多数升级到8了,驱动需要升级。

4.lts服务不定期挂掉问题,根据github上的issue改了sh文件里的temp目录后正常。

上一篇:面向服务架构SOA相关知识点整理总结


下一篇:在qemu-system上跑arm-Debian