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

相关推荐
❀͜͡傀儡师29 分钟前
docker一键部署HFish蜜罐
运维·docker·容器
DO_Community41 分钟前
DigitalOcean容器注册表推出多注册表支持功能
服务器·数据库·docker·kubernetes
dnpao1 小时前
linux onlyoffice服务向docker容器中添加中文字体
linux·运维·docker
回忆是昨天里的海1 小时前
k8s暴露服务-Ingress环境部署
云原生·容器·kubernetes
tzhou644522 小时前
Kubernetes Pod 入门
云原生·容器·kubernetes
java_logo2 小时前
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
docker·容器·开源·dify部署·dify部署文档·dify部署方案·dify部署教程
jarreyer3 小时前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟3 小时前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝3 小时前
docker部署gitlab
docker·容器·gitlab
知识分享小能手3 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker