使用 Dockerfile 和启动脚本注册 XXL-Job 执行器的正确 IP 地址

解决方案:使用 Dockerfile 和启动脚本注册 XXL-Job 执行器的正确 IP 地址

在使用容器化方式注册 XXL-Job 执行器时,由于容器的 IP 地址是动态分配的,可能会导致调度中心无法访问执行器。为了解决这个问题,可以使用 Dockerfile 和启动脚本的方式来动态获取容器的 IP 地址,并正确注册到 XXL-Job。

在华为云容器化服务中,XXL-Job 执行器自动注册的 IP 地址通常是 http://169.254.1.1:xxxx/,这个地址任务调度器无法访问。

分布式部署的方式手动去填写ip地址肯定不行,因为这个ip地址每次都是变动的。

所以,需要的方案也很简单,就是在容器启动的时候,获取容器的ip地址,然后在启动java服务时,把ip作为一个向xxl-job注册时的参数就行,具体如下:

方式一:

这样写更方便,就不用多出一个脚本了

bash 复制代码
CMD ["sh", "-c", "EXECUTOR_IP=$(hostname -i) && java -jar xxl-job-executor-1.0.0.jar --spring.profiles.active=prod --xxl.job.executor.ip=$EXECUTOR_IP"]

方式二:

这种方式麻烦点,但如果原先本来就有其他启动脚本的,这样改起来也更清晰。

1. 编写启动脚本

首先,在项目根目录下创建一个 start.sh 启动脚本,用于动态获取容器的 IP 地址并启动 XXL-Job 执行器:

bash 复制代码
#!/bin/bash
EXECUTOR_IP=$(hostname -i)
java -jar xxl-job-executor-1.0.0.jar --spring.profiles.active=prod --xxl.job.executor.ip=$EXECUTOR_IP

此脚本通过 hostname -i 动态获取容器的 IP 地址,并将其传递给 XXL-Job 执行器启动命令中的 xxl.job.executor.ip 参数。

2. 修改 Dockerfile

Dockerfile 中,将启动脚本复制到容器中并设置为入口命令:

Dockerfile 复制代码
FROM eclipse-temurin:17.0.11_9-jre

ARG path

# 创建工作目录
RUN mkdir -p /home/work/
WORKDIR /home/work

# 下载并解压 XXL-Job 执行器
RUN wget $path -O /home/work/xxl-job-executor.tgz
RUN tar -zxvf /home/work/xxl-job-executor.tgz -C /home/work/

# 复制启动脚本到容器
COPY start.sh /home/work/start.sh
RUN chmod +x /home/work/start.sh

# 暴露执行器的端口
EXPOSE 8082

# 设置启动脚本为入口点
ENTRYPOINT ["/home/work/start.sh"]
3. 说明
  • 启动脚本:确保容器启动时动态获取正确的 IP 地址,并将其传递给 XXL-Job 执行器。
  • Dockerfile :配置了启动脚本的路径,并使用 ENTRYPOINT 命令确保脚本在容器启动时执行。
直接在Dockerfile中执行命令
4. 总结

通过这种方式,容器在启动时会动态获取自身的 IP 地址,并将其正确注册到 XXL-Job 中,解决了动态 IP 地址在调度回调时无法访问的问题。这种方法适用于在 Kubernetes 或 Docker Swarm 中部署多个动态 IP 的容器环境。

相关推荐
羑悻的小杀马特2 小时前
Docker 容器化部署核心实战:从镜像仓库管理、容器多参数运行到 Nginx 服务配置与正反向代理原理解析
nginx·docker·容器·镜像仓库
DogDaoDao13 小时前
Docker全解析:从核心概念到2025年AI集成新特性
人工智能·docker·eureka·程序员
程序员在线炒粉8元1份顺丰包邮送可乐13 小时前
Docker 部署生产环境可用的 MySQL 主从架构
mysql·docker·架构
liliangcsdn15 小时前
Mac本地docker安装Kibana+ElasticSearch
elasticsearch·macos·docker
优秀的老黄17 小时前
Docker部署RabbitMQ
linux·运维·docker·中间件·容器·centos·rabbitmq
Lin_Aries_042117 小时前
容器使用卷
linux·运维·docker·云原生·容器·eureka
寒士obj17 小时前
Docker的使用及核心命令
运维·docker·容器
邂逅星河浪漫17 小时前
【Docker-Nginx】通过Docker部署Nginx容器
nginx·docker·容器
Dontla18 小时前
Docker Compose healthcheck介绍(监控容器中服务的实际健康状态)数据库健康检查pg_isready
数据库·docker·容器
HeXDev18 小时前
【Docker】一键将运行中的容器打包成镜像并导出
运维·docker·容器