将时区配置为 mysql docker 容器

Configure time zone to mysql docker container

我有一个 mysql 5.7 docker 容器。当我 运行 mysql 命令时:

SELECT now();

它显示的时间是我当前时间的-3 小时(这是合乎逻辑的)。我想在配置文件中设置时区。按照 https://hub.docker.com/_/mysql/ 中的文档,我在 docker-compose.yml 文件中创建了一个卷,如下所示:

mysqldb:
    image: mysql:5.7.21
    container_name: mysql_container
    ports:
      - "3306:3306"
    volumes:
      - ./.docker/etc/mysql/custom.cnf:/etc/mysql/conf.d/custom.cnf

当我浏览容器内的文件时,文件 custom.cnf 就在那里。 在该文件中,我尝试了一些我发现的解决方案,例如:

[mysqld]
default_time_zone='Europe/Sofia'

或者一个不太优雅的折衷方案,因为区域必须每年更改两次(夏季/冬季):

[mysqld]
default_time_zone='+03:00'

但 none 有效。我感觉这个文件根本没有被 mysql 加载,因为如果我尝试在其中放置无效配置,也不会发生任何事情(容器正常启动)。 有什么建议吗?

值应该是

default_time_zone=Europe/Sofia

check details

但这可能会在重新启动 mysql 服务时给您带来错误 like this,因此您应该在编辑 custom.cnf 文件之前使用以下命令。

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p

所以你需要在这种情况下使用 Dockerfile 并像下面这样处理它

FROM mysql:5.7.21
RUN echo "USE mysql;" > /docker-entrypoint-initdb.d/timezones.sql &&  mysql_tzinfo_to_sql /usr/share/zoneinfo >> /docker-entrypoint-initdb.d/timezones.sql

这确保当 mysql 容器加载时它会加载所有时区信息。现在你可以使用它使用环境变量

环境变量

mysqldb:
    #image: mysql:5.7.21
    build: .
    #container_name: mysql_container
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - TZ=Europe/Sofia

将它与配置文件一起使用是一个问题。当您启动数据库时,它会给您一个错误

mysqldb_1  | 2018-04-24T12:29:43.169214Z 0 [Warning] InnoDB: New log files created, LSN=45790
mysqldb_1  | 2018-04-24T12:29:43.215187Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
mysqldb_1  | 2018-04-24T12:29:43.281229Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 2a87fec6-47bb-11e8-9f1e-0242ac110002.
mysqldb_1  | 2018-04-24T12:29:43.284010Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
mysqldb_1  | 2018-04-24T12:29:43.284404Z 0 [ERROR] Fatal error: Illegal or unknown default time zone 'Europe/Sofia'
mysqldb_1  | 2018-04-24T12:29:43.284567Z 0 [ERROR] Aborting

这是因为它需要时区已经加载。也可以解决这个问题,但是太麻烦了。我将只使用环境变量,因为这意味着当容器启动时时区已经设置好。

对我来说,我使用的是 Keramatic https://kitematic.com configure by click on MySQL container General and add TZ specify with your current time show list in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

干杯

mariadb:10.3 docker 容器解释 TZ 环境变量,尽管在 docker 图像的 Readme.md 中未提及。在我的例子中,提供 America\New_York 的值非常有效。