datax和datax-web打包成docker运行

概述

dataxdatax-web从一台机器迁移到另一台时,要重新搭建一套运行环境,比较麻烦;打包成docker镜像后迁移就方便多了;

因为我的mysql版本是8,需要在dataxreadwrite中手动添加8jdbc驱动

所以我先各自下载好了dataxdatax-web,在宿主机上试了一波ok后;

然后手动打包成了docker镜像,方便后续迁移

我的环境
ubuntu22.04
jdk:1.8+
python:3.10.12
maven:3.8.8
docker:26.00
docker-compose:2.24.7
datax-web:2.1.2

打包过程中还是遇到了一些细节问题,比如环境问题,datax自身脚本问题,配置问题等;有一些linuxdocker的认知,解决问题会更有方向一些.

镜像制作完,之后要新部署/迁移就方便多了;

实际部署中发现即使手动加入了新的jdbc驱动,但是在执行日志中还是发现有com.mysql.jdbc.Driver旧驱动的warning信息;

要彻底解决需要down datax的代码,将jdbc驱动版本手动调整为8.0+的版本,然后手动打包重新上传包,我重新打包出来后有2G+...

重新打包方案写在下面了

准备工作

datax
https://github.com/alibaba/DataX/tree/datax_v202303
datax-web
https://github.com/WeiYe-Jing/datax-web/tags
down一波datax-web的源码,用idea打开,然后在bin下新增一个health.sh,一会在启动docker容器时让后台常驻(我想的是直接调用原脚本启动,不改原来的启动脚本,所以自己塞了一个进去);

然后mvn clean install一下,拿到datax-web-2.1.2.tar.gz包;

因为我的mysql8dataxreadwriter下的lib中没有对应的jdbc驱动,所以需要手动下载塞进去;

另外datax运行需要python环境,所以在声明 FROM python:3.10.12 运行环境后, java环境是手动add进去jdk后,手动配置的env环境,这里准备好jdk8的包即可,下面的docker file中有对应配置;

我的运行环境是python3,所以需要从datax的官网上把对应的python脚本down下来,覆盖到datax-web的指定目录下,这个在我的datax和datax-web直接宿主机部署中有写.

上面步骤都ok后,就可以开始打包镜像了;

我另一篇文章有写datax和datax-web直接在宿主机部署,其实宿主机ok了,剩下的无非就是打包进docker镜像
https://blog.csdn.net/weixin_43944305/article/details/133617114

health.sh

bash 复制代码
while true
do
  jps | grep "Datax*"
  sleep 30
done

打包镜像

将准备okdatax文件夹和datax-web文件夹打包并压缩成tar.gz,然后写一个dockerfile,手动build下就可以用了.

dockerfile

bash 复制代码
# 基础镜像
FROM python:3.10.12

# author
MAINTAINER felix

# 创建目录
RUN mkdir -p /app
run mkdir -p /app/datax-python3

# work dir
workdir /app

# 复制文件到路径
add ./pro/datax.tar.gz .
add ./pro/datax-web-2.1.2.tar.gz .

# jdk环境
add ./pro/jdk-8u181-linux-x64.tar.gz .

# 设置JAVA_HOME环境变量
ENV JAVA_HOME="/app/jdk1.8.0_181"
 
# 将JAVA_HOME添加到PATH环境变量
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

# datax支持python3文件替换
copy ./pro/datax-python3 ./datax-python3/ 

#支持python3替换datax/bin下3个文件
run mv -f ./datax-python3/datax.py ./datax/bin/
run mv -f ./datax-python3/dxprof.py ./datax/bin/
run mv -f ./datax-python3/perftrace.py ./datax/bin/

#datax-web-admin 添加mysql8的jdbc驱动
copy ./pro/mysql-connector-j-8.0.33.jar ./datax-web-2.1.2/modules/datax-admin/lib/

# datax自身配置问题,手动将单个channel的大小改为2Mb
RUN sed -i 's/"byte": -1/"byte": 2097152/g' ./datax/conf/core.json


# 启动服务
CMD sh -c "./datax-web-2.1.2/bin/install.sh --force" && sh -c "./datax-web-2.1.2/bin/start-all.sh" && sh -c "./datax-web-2.1.2/bin/health.sh"

docker-compose脚本

我这边把datax-executor的env.properties捞出来映射了下,方便配置

bash 复制代码
version: '3'
services:
  datax-web:
    build:
      context: ./
      dockerfile: ./Dockerfile
    image: datax-web
    container_name: datax-web
    restart: always
    privileged: true
    ports:
      - 9527:9527
    environment:
      - TZ=Asia/Shanghai
      #我的mysql和datax在一个docker网段,所以直接用了容器name链接,正常可以写ip
      - DB_HOST=mysql_8_0
      - DB_PORT=3306
      - DB_USERNAME=root
      - DB_PASSWORD=Cttx10086
      - DB_DATABASE=datax_web
    volumes:
      - ./config/datax-executor/env.properties:/app/datax-web-2.1.2/modules/datax-executor/bin/env.properties
      - ./config/datax-admin/env.properties:/app/datax-web-2.1.2/modules/datax-admin/bin/env.properties
    networks:
      - dev_net

networks:
  dev_net:
    external: true

datax-executor的env.properties

其实也没改啥,就把datax的python脚本路径写了下

bash 复制代码
# environment variables

#JAVA_HOME=""
SERVICE_LOG_PATH=${BIN}/../logs
SERVICE_CONF_PATH=${BIN}/../conf
DATA_PATH=${BIN}/../data


## datax json文件存放位置
JSON_PATH=${BIN}/../json

## executor_port
EXECUTOR_PORT=9999

## 保持和datax-admin端口一致
DATAX_ADMIN_PORT=

## PYTHON脚本执行位置
#PYTHON_PATH=/home/hadoop/install/datax/bin/datax.py
PYTHON_PATH=/app/datax/bin/datax.py

## dataxweb 服务端口
SERVER_PORT=9504

datax-admin的env.properties

datax-webenv.properties映射进去,方便后面调整

bash 复制代码
# environment variables

#JAVA_HOME="/home/felix/app/jdk/jdk1.8.0_181"


WEB_LOG_PATH=${BIN}/../logs
WEB_CONF_PATH=${BIN}/../conf

DATA_PATH=${BIN}/../data
SERVER_PORT=9527

#PID_FILE_PATH=${BIN}/dataxadmin.pid


# mail account
MAIL_USERNAME=""
MAIL_PASSWORD=""


#debug
#REMOTE_DEBUG_SWITCH=true
#REMOTE_DEBUG_PORT=7003

重启脚本

每次都要手敲命令,整个脚本轻松一点

bash 复制代码
#!/bin/sh
echo '==============start stop==========='
docker stop datax-web
echo '==============end stop========='
#docker ps -a | grep datax-web | awk '{print $1}' | xargs docker stop
#docker rm datax-web
echo '=============start docker rm======='
docker ps -a | grep datax-web | awk '{print $1}' | xargs docker rm
echo '=============end docker rm========='

echo '=============start docker rmi======'
docker rmi datax-web
echo '=============end docker rmi========'
docker build -t datax-web:latest .
echo 'ready go'
docker-compose up -d

启动后执行ok

解决datax的com.mysql.jdbc.Driver老驱动问题

1-修改pom中的mysql.driver.version8.0.29

2-修改com.alibaba.datax.plugin.rdbms.util.DataBaseType中的驱动name,并且将"convertToNull"修改为"CONVERT_TO_NULL"

3-修改com.alibaba.datax.plugin.writer.adswriter.load.AdsHelper中的驱动name

4-重新打包后上传新的datax压缩包

bash 复制代码
mvn -U clean package assembly:assembly -Dmaven.test.skip=true

参考博文
https://www.cnblogs.com/ll409546297/p/17541727.html
https://www.cnblogs.com/zifan/p/12550747.html

相关推荐
jingshaoqi_ccc16 小时前
ubuntu 24下面安装docker
ubuntu·docker·eureka
关关长语17 小时前
Vue本地部署包快速构建为Docker镜像
前端·vue.js·docker
水滴与鱼17 小时前
DOCKER制作ROS运行的镜像文件
运维·docker·容器
洒家肉山大魔王19 小时前
Kubernetes中Pod 处于 CrashLoopBackOff 状态(生产环境)
linux·容器·kubernetes·pod·pod循环重启
杨浦老苏20 小时前
安全的消息传递和协作工具Virola Messenger
docker·即时通讯·群晖·im
Lynnxiaowen21 小时前
今天我们学习kubernetes内容Ingress资源对象
学习·容器·kubernetes
jason成都1 天前
emqx的docker部署
运维·docker·容器
mixboot1 天前
docker 国内镜像源
docker·镜像源
谷粒.1 天前
云原生时代的测试策略:Kubernetes环境下的测试实践
运维·网络·云原生·容器·kubernetes
java_logo1 天前
Milvus GUI ATTU Docker 容器化部署指南
运维·数据库·docker·容器·eureka·milvus