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

相关推荐
Java程序之猿1 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
来一杯龙舌兰2 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
玖疯子2 小时前
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
docker
暴富的Tdy2 小时前
【快速上手Docker 简单配置方法】
docker·容器·eureka
Karoku0663 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
节点。csn3 小时前
Hadoop yarn安装
大数据·hadoop·分布式
saynaihe4 小时前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
NiNg_1_2345 小时前
基于Hadoop的数据清洗
大数据·hadoop·分布式
G_whang5 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器
认真学习的小雅兰.5 小时前
如何在Ubuntu上利用Docker和Cpolar实现Excalidraw公网访问高效绘图——“cpolar内网穿透”
linux·ubuntu·docker