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目录后正常。

相关推荐
爱的叹息7 分钟前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
千层冷面1 小时前
RabbitMQ 发送者确认机制详解
分布式·rabbitmq·ruby
ChinaRainbowSea1 小时前
3. RabbitMQ 的(Hello World) 和 RabbitMQ 的(Work Queues)工作队列
java·分布式·后端·rabbitmq·ruby·java-rabbitmq
敖正炀1 小时前
基于RocketMQ的可靠消息最终一致性分布式事务解决方案
分布式
程序员 小柴1 小时前
docker的与使用
java·docker·eureka
ghostwritten2 小时前
Docker Registry Clean
运维·docker·容器
宋冠巡3 小时前
Windows安装Docker(Docker Desktop)
windows·docker·容器
一條狗3 小时前
随笔 20250402 分布式 ID 生成器 Snowflake 里面的坑
分布式
小马爱打代码3 小时前
Kubernetes 中部署 Ceph,构建高可用分布式存储服务
分布式·ceph·kubernetes
码熔burning3 小时前
【Spring Cloud Alibaba】:Nacos 入门讲解
分布式·spring cloud·微服务