Docker 中 MySQL容器时区不对,导致插入的时间不准确

查询 MySQL 时区及当前时间

mysql> show variables like '%zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2019-10-15 05:37:07 |
+---------------------+
1 row in set
# 当前时间是  2019-10-15 13:37:07,差了 8 小时
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

由于 docker 容器中,不能直接修改文件,所以只能现在 Host 中改好后,再利用 docker cp 复制到容器中。

修改 mysql 配置文件,配置时区时区为:东八区

[root@localhost ~]# vi /etc/my.cnf
[mysqld]
# set time-zone
default-time-zone = '+8:00'
# does not care about letter case
lower_case_table_names=1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

复制配置文件到 docker mysql 容器中,MySQL 容器中的 配置文件在 /etc/mysql/mysql.conf.d/mysqld.cnf

# usage:docker cp docker cp [OPTIONS] SRC_PATH CONTAINER_NAME:DEST_PATH
docker cp /etc/my.cnf mysql5.7:/etc/mysql/mysql.conf.d/mysqld.cnf
  • 1
  • 2

再查询时区和时间,时间已经更改好了,是我们想要的。

mysql> show variables like '%zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | +08:00 |
+------------------+--------+
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2019-10-15 13:47:07 |
+---------------------+
1 row in set
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

现在再插入数据,时间就正常了。

注:此方式仅适合解决因数据库时区不正确而导致的问题,更详细问题请参考 https://segmentfault.com/q/1010000010791397 中的讨论

原文地址:https://www.cnblogs.com/wangsongbai/p/13444588.html