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

相关推荐
高旭博1 小时前
7. kubernetes资源——service服务
云原生·容器·kubernetes
斯普信专业组2 小时前
Docker 常用命令与时区配置指南
docker·容器·eureka
天一生水water13 小时前
ubuntu使用毫秒镜像方式安装docker mysql
ubuntu·阿里云·docker
Qayrup16 小时前
docker 搭建私有仓库,推送并拉取
运维·docker·容器
郭庆汝16 小时前
docker拉取英伟达官方cuda11.8镜像
docker·cuda11.8
天下不喵17 小时前
Ubuntu24.04安装Docker过程记录
docker
黑黍18 小时前
如何在k8s中配置并使用nvidia显卡
云原生·容器·kubernetes
冷血~多好19 小时前
使用docker部署elk,实现日志追踪
elk·docker·容器
会飞的小蛮猪19 小时前
SkyWalking运维之路(Java探针接入)
java·运维·经验分享·容器·skywalking
天一生水water20 小时前
docker-compose安装
运维·docker·容器