【问题标题】:Configure time zone to mysql docker container将时区配置为 mysql docker 容器
【发布时间】:2018-04-21 19:43:39
【问题描述】:

我有一个 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'

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

【问题讨论】:

  • 这个问题不重复。我不想设置 docker 容器的时间,但更喜欢在 .cnf 文件中设置 mysql 时间,就像我能够在它的 .ini 文件中使用 PHP 一样。

标签: mysql docker docker-compose my.cnf


【解决方案1】:

所以在这种情况下你需要使用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

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

【讨论】:

  • 非常感谢您的解决方案,它有效!我将被允许在“17 小时”内奖励赏金,我会这样做。我想拥有最优雅和最简单的解决方案,因为我不是高级 linux 用户,也不是 docker 高级用户......但在这种情况下,我将有一些新东西要学习:)
  • 经过多次尝试,试图绕过使用单独的 Dockerfile,我放弃并使用了第一个解决方案,该解决方案涉及使用 docker-compose 构建的 Dockerfile。感谢您的解决方案!
【解决方案2】:

mariadb:10.3 docker 容器解释了 TZ 环境变量,尽管它在 docker 映像的 Readme.md 中没有提及。在我的情况下,提供 America\New_York 的值非常有效。

【讨论】:

    【解决方案3】:

    对我来说,我正在使用 Keramatic https://kitematic.com 通过单击 MySQL 容器 General 进行配置并添加 TZ 指定您当前的时间在https://en.wikipedia.org/wiki/List_of_tz_database_time_zones显示列表

    干杯

    【讨论】:

      【解决方案4】:

      值应该是

      default_time_zone=Europe/Sofia
      

      check details

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        • 1970-01-01
        • 2020-06-03
        • 2019-08-11
        • 2019-08-26
        • 1970-01-01
        相关资源
        最近更新 更多