Docker Hue 时区修改完整指南

Posted on Mon 08 September 2025 in 技术

问题描述

使用Docker启动Hue后,发现时区不正确,显示UTC时间而不是中国标准时间(CST)。具体表现为: - HDFS文件时间显示为UTC时间(如06:00-06:01) - 实际文件创建时间为中国时间(如14:00-14:01) - Hue日志时间格式混乱

解决方案概述

需要从多个层面修改时区设置: 1. 容器系统时区设置 2. Hue配置文件时区设置 3. Django时区设置 4. 文件浏览器模块时区处理

详细修改步骤

1. 检查当前容器状态

# 查看运行中的Hue容器
docker ps -a | grep hue

# 检查容器时区
docker exec <container_name> date

# 检查Hue日志时间格式
docker logs <container_name> --tail 10

2. 备份原始配置

# 备份Hue配置文件
cp /data/server/hue-server/config/hue.ini /data/server/hue-server/config/hue.ini.backup.$(date +%Y%m%d_%H%M%S)
cp /data/server/hue-server/config/z-hue-overrides.ini /data/server/hue-server/config/z-hue-overrides.ini.backup.$(date +%Y%m%d_%H%M%S)

3. 修改Hue配置文件中的时区设置

3.1 修改主配置文件

# 修改 hue.ini 中的时区设置
sed -i 's/time_zone=America\/Los_Angeles/time_zone=Asia\/Shanghai/g' /data/server/hue-server/config/hue.ini

# 添加Django时区设置
sed -i '/time_zone=Asia\/Shanghai/a use_tz=true' /data/server/hue-server/config/hue.ini

3.2 修改覆盖配置文件

# 修改 z-hue-overrides.ini 中的时区设置
sed -i 's/time_zone=America\/Los_Angeles/time_zone=Asia\/Shanghai/g' /data/server/hue-server/config/z-hue-overrides.ini

4. 重新创建容器(包含时区和DNS设置)

4.1 停止并删除旧容器

docker stop <old_container_name>
docker rm <old_container_name>

4.2 创建新容器

docker run -d --name hue_new \
  -p 8888:8888 \
  -e TZ=Asia/Shanghai \
  -v /etc/localtime:/etc/localtime:ro \
  -v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro \
  -v /data/server/hue-server/config:/usr/share/hue/desktop/conf \
  --dns=100.100.2.136 \
  --dns=8.8.8.8 \
  gethue/hue:latest

5. 修改文件浏览器模块时区处理

5.1 备份原始文件

docker exec hue_new cp /usr/share/hue/apps/filebrowser/src/filebrowser/views.py /usr/share/hue/apps/filebrowser/src/filebrowser/views.py.backup

5.2 修改时区处理代码

# 添加Django时区导入
docker exec hue_new sed -i "s/from datetime import datetime/from datetime import datetime, timezone, timedelta\nfrom django.utils import timezone as django_timezone/g" /usr/share/hue/apps/filebrowser/src/filebrowser/views.py

# 修改时间格式化代码
docker exec hue_new sed -i "s/datetime.fromtimestamp(stats.mtime).strftime('%B %d, %Y %I:%M %p')/django_timezone.make_aware(datetime.fromtimestamp(stats.mtime)).strftime('%B %d, %Y %I:%M %p')/g" /usr/share/hue/apps/filebrowser/src/filebrowser/views.py

5.3 清除Python缓存

docker exec hue_new find /usr/share/hue -name "*.pyc" -path "*/filebrowser/*" -delete
docker exec hue_new find /usr/share/hue -name "__pycache__" -path "*/filebrowser/*" -exec rm -rf {} \; 2>/dev/null || true

6. 重启容器应用修改

docker restart hue_new

7. 验证修改结果

7.1 检查系统时区

# 检查容器系统时间
docker exec hue_new date

# 检查时区环境变量
docker exec hue_new env | grep TZ

# 检查时区文件
docker exec hue_new cat /etc/timezone

7.2 检查Hue应用时区

# 查看Hue日志,确认时间格式
docker logs hue_new --tail 10

# 检查Django时区设置
docker exec hue_new /usr/share/hue/build/env/bin/python3 -c "import os; os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'desktop.settings'); import django; django.setup(); from django.utils import timezone; print('Django timezone:', timezone.get_current_timezone())"

7.3 检查文件浏览器时间显示

访问Hue文件浏览器,查看HDFS文件的时间显示是否正确。

关键配置说明

1. 环境变量设置

  • TZ=Asia/Shanghai: 设置容器系统时区
  • -v /etc/localtime:/etc/localtime:ro: 挂载主机时区文件
  • -v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro: 挂载时区信息文件

2. DNS设置

  • --dns=100.100.2.136: 内网DNS服务器
  • --dns=8.8.8.8: 公共DNS服务器

3. 配置文件修改

  • hue.ini: 主配置文件中的 time_zone=Asia/Shanghaiuse_tz=true
  • z-hue-overrides.ini: 覆盖配置文件中的 time_zone=Asia/Shanghai

4. 代码修改

  • 文件:/usr/share/hue/apps/filebrowser/src/filebrowser/views.py
  • 修改:使用Django的时区设置处理文件时间显示

完整的一键脚本

#!/bin/bash
# Hue时区修改完整脚本

CONTAINER_NAME="hue_new"
CONFIG_PATH="/data/server/hue-server/config"

echo "开始修改Hue时区设置..."

# 1. 备份配置
echo "备份原始配置..."
cp $CONFIG_PATH/hue.ini $CONFIG_PATH/hue.ini.backup.$(date +%Y%m%d_%H%M%S)
cp $CONFIG_PATH/z-hue-overrides.ini $CONFIG_PATH/z-hue-overrides.ini.backup.$(date +%Y%m%d_%H%M%S)

# 2. 修改配置文件
echo "修改时区配置..."
sed -i 's/time_zone=America\/Los_Angeles/time_zone=Asia\/Shanghai/g' $CONFIG_PATH/hue.ini
sed -i 's/time_zone=America\/Los_Angeles/time_zone=Asia\/Shanghai/g' $CONFIG_PATH/z-hue-overrides.ini
sed -i '/time_zone=Asia\/Shanghai/a use_tz=true' $CONFIG_PATH/hue.ini

# 3. 停止旧容器
echo "停止旧容器..."
docker stop $CONTAINER_NAME 2>/dev/null || true
docker rm $CONTAINER_NAME 2>/dev/null || true

# 4. 创建新容器
echo "创建新容器..."
docker run -d --name $CONTAINER_NAME \
  -p 8888:8888 \
  -e TZ=Asia/Shanghai \
  -v /etc/localtime:/etc/localtime:ro \
  -v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro \
  -v $CONFIG_PATH:/usr/share/hue/desktop/conf \
  --dns=100.100.2.136 \
  --dns=8.8.8.8 \
  gethue/hue:latest

# 5. 等待启动
echo "等待容器启动..."
sleep 20

# 6. 修改文件浏览器代码
echo "修改文件浏览器时区处理..."
docker exec $CONTAINER_NAME cp /usr/share/hue/apps/filebrowser/src/filebrowser/views.py /usr/share/hue/apps/filebrowser/src/filebrowser/views.py.backup
docker exec $CONTAINER_NAME sed -i "s/from datetime import datetime/from datetime import datetime, timezone, timedelta\nfrom django.utils import timezone as django_timezone/g" /usr/share/hue/apps/filebrowser/src/filebrowser/views.py
docker exec $CONTAINER_NAME sed -i "s/datetime.fromtimestamp(stats.mtime).strftime('%B %d, %Y %I:%M %p')/django_timezone.make_aware(datetime.fromtimestamp(stats.mtime)).strftime('%B %d, %Y %I:%M %p')/g" /usr/share/hue/apps/filebrowser/src/filebrowser/views.py

# 7. 清除缓存
echo "清除Python缓存..."
docker exec $CONTAINER_NAME find /usr/share/hue -name "*.pyc" -path "*/filebrowser/*" -delete
docker exec $CONTAINER_NAME find /usr/share/hue -name "__pycache__" -path "*/filebrowser/*" -exec rm -rf {} \; 2>/dev/null || true

# 8. 重启容器
echo "重启容器应用修改..."
docker restart $CONTAINER_NAME

# 9. 等待重启
echo "等待容器重启..."
sleep 25

# 10. 验证结果
echo "验证时区设置..."
echo "系统时间:"
docker exec $CONTAINER_NAME date
echo ""
echo "Hue日志时间格式:"
docker logs $CONTAINER_NAME --tail 3
echo ""
echo "Django时区设置:"
docker exec $CONTAINER_NAME /usr/share/hue/build/env/bin/python3 -c "import os; os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'desktop.settings'); import django; django.setup(); from django.utils import timezone; print('Django timezone:', timezone.get_current_timezone())"

echo "时区修改完成!"
echo "请访问 http://localhost:8888 查看文件浏览器中的时间显示是否正确。"

常见问题排查

1. DNS解析问题

如果出现 Name or service not known 错误:

# 检查DNS配置
docker inspect <container_name> | grep -A 5 -B 5 -i dns

# 确保容器有正确的DNS设置
--dns=100.100.2.136 --dns=8.8.8.8

2. 时区仍然不正确

检查所有配置文件中的时区设置:

grep -r -i "time_zone\|timezone" /data/server/hue-server/config/ | grep -v ".backup"

3. 文件浏览器时间显示不正确

检查代码修改是否正确:

docker exec <container_name> grep -n -A 2 -B 2 "mtime.*datetime" /usr/share/hue/apps/filebrowser/src/filebrowser/views.py

4. 容器无法启动

检查挂载路径是否正确:

# 确保配置文件路径存在
ls -la /data/server/hue-server/config/

# 检查挂载权限
ls -la /data/server/hue-server/config/hue.ini

验证成功标志

  • 容器系统时间显示:Mon Sep 8 15:08:02 Asia 2025
  • Hue日志时间格式:[08/Sep/2025 15:08:02 +0800]
  • 环境变量:TZ=Asia/Shanghai
  • Django时区:Asia/Shanghai
  • HDFS文件时间显示:正确的中国时间(如14:00-14:01)
  • HDFS连接正常,无DNS解析错误

注意事项

  1. 备份重要: 修改前务必备份原始配置文件和代码文件
  2. DNS设置: 确保容器有正确的DNS配置,否则无法连接HDFS
  3. 配置文件: 需要修改两个配置文件:hue.iniz-hue-overrides.ini
  4. 代码修改: 需要修改文件浏览器模块的时区处理代码
  5. 重启生效: 修改配置和代码后需要重启容器才能生效
  6. 权限检查: 确保挂载的配置文件有正确的读写权限
  7. 缓存清理: 修改Python代码后需要清除缓存

回滚方法

如果修改后出现问题,可以按以下步骤回滚:

# 1. 恢复配置文件
cp /data/server/hue-server/config/hue.ini.backup.* /data/server/hue-server/config/hue.ini
cp /data/server/hue-server/config/z-hue-overrides.ini.backup.* /data/server/hue-server/config/z-hue-overrides.ini

# 2. 恢复代码文件
docker exec <container_name> cp /usr/share/hue/apps/filebrowser/src/filebrowser/views.py.backup /usr/share/hue/apps/filebrowser/src/filebrowser/views.py

# 3. 重启容器
docker restart <container_name>