使用Dockerfile部署xxljob
1. 背景
- 我们在使用定时任务调度时,通常会使用xxljob
- 容器化部署xxljob,通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说,没有任何问题。但是在arm架构的服务器上,运行容器会报错架构不匹配。
shell
The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
- 由于在arm架构无法启动容器,因此,我们采用Dockerfile运行jar包的方式创建容器,使用这种方式,可以规避架构导致的容器运行失败的问题。
2. 前提条件:
- 已安装docker及docker-compose
- 已存在 jdk 镜像,我使用的是openjdk 17
3. 拉取xxljob源码,打包编译
- git 项目地址
https://github.com/xuxueli/xxl-job
拉取代码 - 导入数据
在项目的 doc/db 目录下有一个sql文件,导入自己的数据库中 - idea打开项目,使用maven 拉取依赖
- 修改xxl-job-admin工程的 application.properties配置文件,将数据库的配置改为自己的连接信息
- 运行xxl-job-admin工程,查看是否正常启动
- 启动成功后访问 http://localhost:8080/xxl-job-admin
- 如果能正常访问,说明环境没有问题,此时可以将xxl-job-admin打包成jar包
4. 部署xxljob
- 将 xxl-job-admin.jar 上传到服务器指定目录,我放在了 /data/xxl-job 目录
- 在同级目录创建 logback-spring.xml 用于配置日志
shell
vim logback-spring.xml
shell
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 -->
<property name="LOG_HOME" value="/data/logs/xxl-job/" />
<!--<property name="COLOR_PATTERN" value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''})- %gray(%msg%xEx%n)" />-->
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_HOME}/xxl-job-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
</encoder>
</appender>
<!--myibatis log configure -->
<logger name="com.apache.ibatis" level="TRACE" />
<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
- 在同级目录创建 Dockerfile 文件
shell
vim Dockerfile
shell
FROM openjdk:17 # 引入jdk,对应自己的版本
ENV TZ=Asia/Shanghai
ADD xxl-job-admin.jar /data/xxl-job/xxl-job-admin.jar
EXPOSE 8080
CMD java ${JAVA_OPTS} -Dlogging.config=/data/xxl-job/logback-spring.xml -jar /data/xxl-job/xxl-job-admin.jar
- 创建 docker-compose-xxljob.yaml
shell
vim docker-compose-xxljob.yaml
yaml
version: '3'
services:
dsp-xxl-job:
restart: always
build:
context: /data/xxl-job
dockerfile: Dockerfile
container_name: xxl-job
image: xxl-job
hostname: xxl-job
network_mode: host
privileged: true
environment:
TZ: Asia/Shanghai
SPRING_DATASOURCE_URL: jdbc:mysql://xxx:3306/xxl-job?Unicode=true&characterEncoding=UTF-8
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: 123456
ports:
- 8080:8080
volumes:
- '/etc/localtime:/etc/localtime:ro'
- '/data/xxl-job:/data/xxl-job:ro'
- '/data/logs/xxl-job:/data/logs/xxl-job:rw'
- 启动容器
shell
docker-compose -f docker-compose-xxljob.yaml up -d