You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中MySQL 5.7初始化:如何配置正确的time_zone_name表?

在Docker中初始化MySQL 5.7时预配置Asia/Hong_Kong时区的解决方法

方法1:通过初始化脚本自动填充时区表

Docker官方MySQL镜像会自动执行/docker-entrypoint-initdb.d/目录下的所有.sql、.sh脚本,按顺序完成初始化后的配置。你可以提前生成包含Asia/Hong_Kong时区的SQL脚本,挂载到这个目录:

  1. 本地生成时区SQL:
    在Linux/macOS环境下执行以下命令,提取Asia/Hong_Kong对应的时区数据并保存为init_timezone.sql:
    mysql_tzinfo_to_sql /usr/share/zoneinfo/Asia/Hong_Kong > init_timezone.sql
    
    若需要完整时区数据集,直接执行mysql_tzinfo_to_sql /usr/share/zoneinfo > init_timezone.sql即可。
  2. 启动容器时挂载脚本:
    docker run -d \
      -v /path/to/init_timezone.sql:/docker-entrypoint-initdb.d/init_timezone.sql \
      -v /path/to/your/my.cnf:/etc/mysql/my.cnf \
      -e MYSQL_ROOT_PASSWORD=your_root_pwd \
      mysql:5.7
    
    MySQL初始化完成后会自动执行脚本填充时区表,后续mysqld启动时读取my.cnf里的default_time_zone='Asia/Hong_Kong'就不会触发错误。

方法2:修改启动命令,先填充时区再启动服务

如果不想单独准备初始化脚本,可以直接在启动容器时指定命令,先完成时区表填充,再启动mysqld服务:

docker run -d \
  -v /path/to/your/my.cnf:/etc/mysql/my.cnf \
  -e MYSQL_ROOT_PASSWORD=your_root_pwd \
  mysql:5.7 \
  sh -c "
    # 等待MySQL初始化完成并可正常连接
    until mysqladmin ping -u root -p\$MYSQL_ROOT_PASSWORD --silent; do
      sleep 2
    done
    # 填充完整时区表
    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p\$MYSQL_ROOT_PASSWORD mysql
    # 替换当前进程为mysqld,保证容器能正常管理服务
    exec mysqld
  "

方法3:临时绕过初始化错误,补全时区后再配置

如果已经因为default_time_zone设置导致容器启动失败,可以先临时移除该配置,启动容器后手动填充时区表,再恢复配置重启:

  1. 临时启动容器(不设置默认时区):
    docker run -d \
      -v /path/to/your/my.cnf.temp:/etc/mysql/my.cnf \
      -e MYSQL_ROOT_PASSWORD=your_root_pwd \
      --name mysql-temp \
      mysql:5.7
    
  2. 进入容器执行时区填充:
    docker exec -it mysql-temp sh
    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
    
  3. 停止容器,换回包含default_time_zone='Asia/Hong_Kong'的my.cnf配置文件,重新启动容器即可。

内容的提问来源于stack exchange,提问作者Peter Mattex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:06:50