Ce message d'erreur apparaît lorsque j'utilise ubuntu 16.04 et le dernier mysql 5.7.19-0ubuntu0.16.04.1 dans une image Docker.
Que pourrait-on faire pour résoudre ce problème?
Pour reproduire l'erreur
Obtenez le
Dockerfile
:FROM ubuntu:16.04 RUN apt update RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
(également disponible ici )
Construire et exécuter:
docker build -t mysqlfail . docker run -it mysqlfail tail -1 /var/log/mysql/error.log
aurait été montré le journal des erreurs suivant:
2017-08-26T11: 48: 45.398445Z 1 [Avertissement] root @ localhost est créé avec un mot de passe vide! Veuillez envisager de désactiver l'option --initialize-insecure.
C'est exactement ce que nous voulions: un mysql sans mot de passe root défini pour le moment.
Dans le passé (Ubuntu 14.04 / mysql 5.5),
service mysql start
c'était possible. Maintenant, si vous essayez cela, cela échouedocker run -it mysqlfail service mysql start * Starting MySQL database server mysqld No directory, logging in with HOME=/ [fail]
et
/var/log/mysql/error.log
contient une ligne:2017-08-26T11: 59: 57.680618Z 0 [ERREUR] Erreur fatale: impossible d'ouvrir et de verrouiller les tables de privilèges: le moteur de stockage de table pour 'utilisateur' n'a pas cette option
journal de construction (pour l'intégralité Dockerfile
)
Sending build context to Docker daemon 2.56kB
Step 1/4 : FROM ubuntu:16.04
---> ebcd9d4fca80
...
Step 4/4 : RUN service mysql start
---> Running in 5b899739d90d
* Starting MySQL database server mysqld
...fail!
The command '/bin/sh -c service mysql start' returned a non-zero code: 1
suite bizarre
Après les expériences décrites dans ma tentative de réponse , j'ai créé un script shell qui fait un
select count(*)
requête sur chaque table de l'espace mysql trois fois de suite (car les expériences montrent que sur certaines tables, la requête échouera exactement deux fois :-().
Puis un
mysql_upgrade
et le
service mysql restart
est essayé. Dans le Dockerfile
script est mis à disposition via
COPY mysqltest.sh .
Les essais avec ce script donnent des résultats étranges / fous.
Car le
Docker environment
départ échoue encore[ERREUR] Erreur fatale: impossible d'ouvrir et de verrouiller les tables de privilèges: le moteur de stockage de table pour 'utilisateur' n'a pas cette option
Exécution du script
sh mysqltest.sh root
dans les
docker environment
pistes de2017-08-27T09: 12: 47.021528Z 12 [ERREUR] / usr / sbin / mysqld: La table './mysql/db' est marquée comme
plantée et doit être réparée 2017-08-27T09: 12: 47.050141Z 12 [ERREUR ] Impossible de réparer la table: mysql.db
2017-08-27T09: 12: 47.055925Z 13 [ERREUR] / usr / sbin / mysqld: La table './mysql/db' est marquée comme
plantée et doit être réparée 2017-08 -27T09: 12: 47.407700Z 54 [ERREUR] / usr / sbin / mysqld: La table './mysql/proc' est marquée comme
plantée et doit être réparée 2017-08-27T09: 12: 47.433516Z 54 [ERREUR] Ne pouvait pas ' t table de réparation: mysql.proc
2017-08-27T09: 12: 47.440695Z 55 [ERREUR] / usr / sbin / mysqld: La table './mysql/proc' est marquée comme
plantée et doit être réparée 2017-08-27T09: 12: 47.769485Z 81 [ERREUR] / usr / sbin / mysqld: Table './mysql/tables_priv'est marqué comme écrasé et doit être réparé
2017-08-27T09: 12: 47.792061Z 81 [ERREUR] Impossible de réparer la table: mysql.tables_priv
2017-08-27T09: 12: 47.798472Z 82 [ERREUR] / usr / sbin / mysqld: Table './mysql/ tables_priv 'est marqué comme planté et doit être réparé
2017-08-27T09: 12: 47.893741Z 99 [ERREUR] / usr / sbin / mysqld: Le tableau' ./mysql/user 'est marqué comme planté et doit être réparé
2017-08 -27T09: 12: 47.914288Z 99 [ERREUR] Impossible de réparer la table: mysql.user
2017-08-27T09: 12: 47.920459Z 100 [ERREUR] / usr / sbin / mysqld: La table './mysql/user' est marqué comme écrasé et doit être réparé
Que se passe-t-il ici pour provoquer ce comportement étrange?
Réponses:
Ran dans le même problème aujourd'hui. J'exécute le service MySQL pendant la construction du docker pour les tests unitaires et la mise à niveau vers MySQL CE 5.7.19 de MariaDB a interrompu la construction. Ce qui a résolu le problème pour moi était de s'exécuter à
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
chaque fois avant de démarrer le service mysql.Donc, mon Dockerfile ressemble à ceci maintenant:
J'espère que cela t'aides.
la source
chmod
commande. La génération réussit lorsque je l'exécute sur un serveur Ubuntu distant, mais échoue lorsque je l'exécute sur ma machine locale (OS X). L'ajout de lachmod
commande au Dockerfile enfant a résolu le problème. Étrange .solution de contournement
Description du problème
Le problème sous-jacent tel qu'indiqué par aalexgabi est dû à l'implémentation des standards POSIX d'OverlayFS :
Référence:
la source
J'ai confirmé l'erreur sur overlayfs (overlay2) qui est la valeur par défaut sur Docker pour Mac. L'erreur se produit lors du démarrage de mysql sur l'image, après avoir créé une image avec mysql.
Le passage à "aufs" a résolu le problème. (Sur Docker pour Mac, le fichier "daemon.json" peut être modifié en choisissant le menu "Préférences ...", en sélectionnant l'onglet "Démon" et en sélectionnant l'onglet "Avancé".)
/etc/docker/daemon.json:
Réf:
https://github.com/moby/moby/issues/35503
https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028
la source
Voici une réponse que je ne vois pas encore ici.
Ajoutez ceci à votre dockerfile:
VOLUME /var/lib/mysql
Cela entraînera le dossier / var / lib / mysql à utiliser le système de fichiers natif plutôt que overlayFS. Cela contourne ce problème.
C'est la solution que l'image docker officielle de mysql utilise pour gérer cela, comme vous pouvez le voir ici: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile
la source
Ce n'est peut-être pas encore tout à fait la solution. Quoi qu'il en soit, cela pourrait indiquer aux autres une réponse «correcte»
Le journal de session bash de docker ci-dessous montre une séquence d'étapes qui conduisent à des erreurs étranges et enfin à pouvoir démarrer correctement le démon mysql dans l'environnement docker.
Essayer de démarrer le démon dans cette session échoue deux fois - une fois à cause de la table mysql.user et une fois à cause de la table mysql.db. L'exécution du démon mysql avec --skip-grant-tables fonctionne mais il y a aussi des problèmes avec la simple sélection * des commandes sur ces tables.
Fait étrangement deux requêtes simples:
puis tuer le démon pour le démarrer correctement avec
semble fonctionner. Je vais maintenant essayer d'automatiser cela comme solution de contournement. Je cherche toujours une solution «appropriée» au problème et certains savent quelle est la raison de ce comportement étrange.
Dockerfile
journal de construction
journal de session bash
la source