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脚本,挂载到这个目录:
- 本地生成时区SQL:
在Linux/macOS环境下执行以下命令,提取Asia/Hong_Kong对应的时区数据并保存为init_timezone.sql:
若需要完整时区数据集,直接执行mysql_tzinfo_to_sql /usr/share/zoneinfo/Asia/Hong_Kong > init_timezone.sqlmysql_tzinfo_to_sql /usr/share/zoneinfo > init_timezone.sql即可。 - 启动容器时挂载脚本:
MySQL初始化完成后会自动执行脚本填充时区表,后续mysqld启动时读取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.7my.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设置导致容器启动失败,可以先临时移除该配置,启动容器后手动填充时区表,再恢复配置重启:
- 临时启动容器(不设置默认时区):
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 - 进入容器执行时区填充:
docker exec -it mysql-temp sh mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql - 停止容器,换回包含
default_time_zone='Asia/Hong_Kong'的my.cnf配置文件,重新启动容器即可。
内容的提问来源于stack exchange,提问作者Peter Mattex
相关产品推荐
相关产品推荐

