DataX date类型数据异常(docker环境时区问题导致)

背景

  • Windows本地和阿里云服务器中使用datax同步txtfile文件到mysql时,date类型数据无差异
  • Docker容器中使用会出现同步完数据时间戳类型数据相差8小时的问题(docker容器时区已通过cp 文件夹的方式解决,容器内执行date命令可正常获取到时间)

容器时区不对

root@119bbbba68e4:/# date
Mon Nov 25 12:01:06 UTC 2019
root@119bbbba68e4:/# date -R
Mon, 25 Nov 2019 12:01:42 +0000
root@119bbbba68e4:/# date +"%Z %z"
UTC +0000

docker容器设置时区

# 打镜像时cp相应文件,或
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 直接挂载相应文件夹(注意系统类型)
docker run  追加-v /etc/localtime:/etc/localtime:ro 

再通过java去获取时区

# 通过java打印输出
System.out.println(TimeZone.getDefault()); //输出当前默认时区

datax在linux上获取时区步骤:其实底层还是通过jvm去获取的

  1. 如有环境变量 TZ设置,则用TZ中设置的时区
  2. 如1没有,则在 /etc/sysconfig/clock文件中找 "ZONE"的值
  3. 如2都没有,就用/etc/localtime 和 /usr/share/zoneinfo 下的时区文件进行匹配,如找到匹配的,就返回对应的路径和文件名。

解决办法

彻底解决容器时区问题

那就彻底解决容器时区问题,复制宿主机或挂载出时区相关文件

仅解决datax的时区问题

运行datax时指定时区(最省事)或获取参照 datax/conf/core.json里面的时区配置和服务器不同导致的数据异常去修改时区(笔者这边是一致的,还是有date类型数据异常的问题)

python2 ${datax_path}/bin/datax.py -p "-Duser.timezone-GMT+8"

参考

  • jvm linux 时区设置

你可能感兴趣的:(DataX date类型数据异常(docker环境时区问题导致))