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/Shanghai和use_tz=truez-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解析错误
注意事项
- 备份重要: 修改前务必备份原始配置文件和代码文件
- DNS设置: 确保容器有正确的DNS配置,否则无法连接HDFS
- 配置文件: 需要修改两个配置文件:
hue.ini和z-hue-overrides.ini - 代码修改: 需要修改文件浏览器模块的时区处理代码
- 重启生效: 修改配置和代码后需要重启容器才能生效
- 权限检查: 确保挂载的配置文件有正确的读写权限
- 缓存清理: 修改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>