Diese Fehlermeldung wird angezeigt, wenn ich Ubuntu 16.04 und das neueste mysql 5.7.19-0ubuntu0.16.04.1 in einem Docker-Image verwende.
Was könnte getan werden, um dies zu beheben?
Um den Fehler zu reproduzieren
Holen Sie sich das
Dockerfile
:FROM ubuntu:16.04 RUN apt update RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
(auch hier erhältlich )
Erstellen und ausführen:
docker build -t mysqlfail . docker run -it mysqlfail tail -1 /var/log/mysql/error.log
hätte das folgende Fehlerprotokoll angezeigt bekommen:
2017-08-26T11: 48: 45.398445Z 1 [Warnung] root @ localhost wurde mit einem leeren Passwort erstellt! Bitte erwägen Sie, die Option --initialize-insecure auszuschalten.
Welches war genau das, was wir wollten: ein MySQL ohne Root-Passwort noch eingestellt.
In der Vergangenheit (Ubuntu 14.04 / MySQL 5.5) war ein
service mysql start
möglich. Wenn Sie dies versuchen, schlägt dies fehldocker run -it mysqlfail service mysql start * Starting MySQL database server mysqld No directory, logging in with HOME=/ [fail]
und
/var/log/mysql/error.log
enthält eine Zeile:2017-08-26T11: 59: 57.680618Z 0 [FEHLER] Schwerwiegender Fehler: Berechtigungstabellen können nicht geöffnet und gesperrt werden: Die Tabellenspeicher-Engine für 'Benutzer' verfügt nicht über diese Option
Bauprotokoll (für das komplette 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
seltsame Fortsetzung
Nach den in meinem Antwortversuch beschriebenen Experimenten habe ich ein Shell-Skript erstellt, das a
select count(*)
Abfrage für jede Tabelle im MySQL-Bereich dreimal hintereinander (da Experimente zeigen, dass bei einigen Tabellen die Abfrage genau zweimal fehlschlägt :-().
Dann ein
mysql_upgrade
und die
service mysql restart
wird versucht. Im wird das Dockerfile
Skript über zur Verfügung gestellt
COPY mysqltest.sh .
Die Versuche mit diesem Skript führen zu seltsamen / verrückten Ergebnissen.
Denn
Docker environment
der Start scheitert noch[FEHLER] Schwerwiegender Fehler: Berechtigungstabellen können nicht geöffnet und gesperrt werden: Die Tabellenspeicher-Engine für 'Benutzer' verfügt nicht über diese Option
Ausführen des Skripts
sh mysqltest.sh root
in den
docker environment
führt zu2017-08-27T09: 12: 47.021528Z 12 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/db' ist als abgestürzt markiert und sollte repariert werden
2017-08-27T09: 12: 47.050141Z 12 [FEHLER ] Tabelle konnte nicht repariert werden: mysql.db
2017-08-27T09: 12: 47.055925Z 13 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/db' ist als abgestürzt markiert und sollte
2017-08 repariert werden -27T09: 12: 47.407700Z 54 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/proc' ist als abgestürzt markiert und sollte repariert werden
2017-08-27T09: 12: 47.433516Z 54 [FEHLER] Konnte nicht ' t repair table: mysql.proc
2017-08-27T09: 12: 47.440695Z 55 [FEHLER] / usr / sbin / mysqld: Die Tabelle './mysql/proc' ist als abgestürzt markiert und sollte repariert werden
2017-08-27T09: 12: 47.769485Z 81 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/tables_priv'ist als abgestürzt markiert und sollte repariert werden
2017-08-27T09: 12: 47.792061Z 81 [FEHLER] Tabelle konnte nicht repariert werden: mysql.tables_priv
2017-08-27T09: 12: 47.798472Z 82 [FEHLER] / usr / sbin / mysqld: Table './mysql/ tables_priv 'ist als abgestürzt markiert und sollte repariert werden
2017-08-27T09: 12: 47.893741Z 99 [FEHLER] / usr / sbin / mysqld: Tabelle' ./mysql/user 'ist als abgestürzt markiert und sollte repariert werden
2017-08 -27T09: 12: 47.914288Z 99 [FEHLER] Tabelle konnte nicht repariert werden: mysql.user
2017-08-27T09: 12: 47.920459Z 100 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/user' ist markiert als abgestürzt und sollte repariert werden
Was ist hier los, um dieses seltsame Verhalten zu verursachen?
Antworten:
Bin heute auf dasselbe Problem gestoßen. Ich führe den MySQL-Dienst während des Docker-Builds für die Komponententests aus und ein Upgrade auf MySQL CE 5.7.19 von MariaDB hat den Build abgebrochen. Was das Problem für mich gelöst hat, war, dass es
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
jedes Mal ausgeführt wurde, bevor der mysql-Dienst gestartet wurde.So sieht mein Dockerfile jetzt aus:
Hoffe das hilft.
quelle
chmod
Befehl bereits aus. Der Build ist erfolgreich, wenn ich ihn auf einem fernen Ubuntu-Server ausführe, schlägt jedoch fehl, wenn ich ihn auf meinem lokalen Computer (OS X) ausführe. Das Hinzufügen deschmod
Befehls zum untergeordneten Dockerfile behebt das Problem. Seltsam .Ich habe den Fehler bei Overlayfs (Overlay2) bestätigt, der in Docker für Mac standardmäßig verwendet wird. Der Fehler tritt auf, wenn MySQL auf dem Image gestartet wird, nachdem ein Image mit MySQL erstellt wurde.
Der Wechsel zu "aufs" löste das Problem. (In Docker für Mac kann die Datei "daemon.json" bearbeitet werden, indem Sie im Menü "Einstellungen" die Registerkarte "Daemon" und dann die Registerkarte "Erweitert" auswählen.)
/etc/docker/daemon.json:
Ref:
https://github.com/moby/moby/issues/35503
https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028
quelle
Umgehung
Problembeschreibung
Das von aalexgabi festgestellte Grundproblem ist auf die Implementierung der POSIX-Standards von OverlayFS zurückzuführen :
Referenz:
quelle
Hier ist eine Antwort, die ich hier noch nicht sehe.
Fügen Sie dies zu Ihrer Docker-Datei hinzu:
VOLUME /var/lib/mysql
Dies bewirkt, dass der Ordner / var / lib / mysql das native Dateisystem anstelle von overlayFS verwendet. Dies umgeht dieses Problem.
Dies ist die Lösung der offizielle mysql Docker Bild verwendet damit umgehen , wie Sie hier sehen können: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile
quelle
Dies ist möglicherweise noch nicht die richtige Lösung. Wie auch immer, es könnte andere auf eine "richtige" Antwort hinweisen
Das Docker-Bash-Sitzungsprotokoll unten zeigt eine Abfolge von Schritten, die zu seltsamen Fehlern führen und es schließlich ermöglichen, den mysql-Dämon in der Docker-Umgebung ordnungsgemäß zu starten.
Der Versuch, den Dämon in dieser Sitzung zu starten, schlägt zweimal fehl - einmal aufgrund der Tabelle mysql.user und einmal aufgrund der Tabelle mysql.db. Das Ausführen des mysql-Daemons mit --skip-grant-tables funktioniert, aber es gibt auch Probleme mit einfachen select * -Befehlen für diese Tabellen.
Seltsamerweise zwei einfache Abfragen:
und dann den Daemon beenden, um ihn richtig zu starten
scheint zu funktionieren. Ich werde jetzt versuchen, dies als Workaround zu automatisieren. Ich bin immer noch auf der Suche nach einer "richtigen" Lösung für das Problem und einer Ahnung, was der Grund für dieses seltsame Verhalten ist.
Dockerfile
Protokoll erstellen
Bash-Sitzungsprotokoll
quelle