J'ai un conteneur docker mysql 5.7. Lorsque j'exécute la commande mysql:
SELECT now();
Il montre le temps -3 heures à mon heure actuelle (ce qui est logique). Je veux définir le fuseau horaire dans un fichier de configuration. En suivant la documentation de https://hub.docker.com/_/mysql/ je crée un volume dans mon docker-compose.yml
fichier comme suit:
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
Lorsque je parcours les fichiers à l'intérieur du conteneur, le fichier custom.cnf
y a-t-il. Dans ce fichier, j'ai essayé certaines des solutions que j'ai trouvées comme:
[mysqld]
default_time_zone='Europe/Sofia'
ou une solution de compromis moins élégante car la zone devra être changée deux fois par an (été/hiver):
[mysqld]
default_time_zone='+03:00'
mais aucun ne fonctionne. J'ai l'impression que ce fichier n'est pas du tout chargé par mysql parce que si j'essaye de mettre une configuration invalide là-dedans, rien ne se passe non plus (le conteneur démarre normalement). Des suggestions à ce sujet?
Vous devez donc utiliser un Dockerfile
dans ce cas et le gérer comme ci-dessous
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
Cela garantit que lorsque le conteneur mysql se charge, il charge toutes les informations de fuseau horaire. Vous pouvez maintenant l'utiliser à l'aide de variables d'environnement
Variable d'environnement
mysqldb:
#image: mysql:5.7.21
build: .
#container_name: mysql_container
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- TZ=Europe/Sofia
L'utiliser avec un fichier de configuration est un problème. Lorsque vous démarrez la base de données, cela vous donnera une erreur
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
En effet, il a besoin que le fuseau horaire soit déjà chargé. Il est possible de résoudre ce problème également, mais trop de tracas. Je vais utiliser la variable d'environnement uniquement car cela signifie que lorsque le conteneur démarre, le fuseau horaire est déjà configuré.
la valeur doit être
default_time_zone=Europe/Sofia
Mais cela pourrait vous donner une erreur comme ceci lors du redémarrage du service mysql, vous devez donc utiliser la commande ci-dessous avant de modifier le fichier custom.cnf.
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p