Ten komunikat o błędzie pojawia się, gdy używam Ubuntu 16.04 i najnowszego mysql 5.7.19-0ubuntu0.16.04.1 na obrazie Docker.
Co można zrobić, aby to naprawić?
Aby odtworzyć błąd
Uzyskaj
Dockerfile
:FROM ubuntu:16.04 RUN apt update RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
(dostępny również tutaj )
Zbuduj i uruchom:
docker build -t mysqlfail . docker run -it mysqlfail tail -1 /var/log/mysql/error.log
wyświetliłby się następujący dziennik błędów:
2017-08-26T11: 48: 45.398445Z 1 [Ostrzeżenie] root @ localhost jest tworzony z pustym hasłem! Rozważ wyłączenie opcji --initialize-niepewne.
Właśnie tego chcieliśmy: mysql bez ustawionego hasła roota.
W przeszłości (ubuntu 14.04 / mysql 5.5)
service mysql start
było możliwe. Teraz, jeśli spróbujesz tego, nie powiedzie siędocker run -it mysqlfail service mysql start * Starting MySQL database server mysqld No directory, logging in with HOME=/ [fail]
i
/var/log/mysql/error.log
zawiera wiersz:2017-08-26T11: 59: 57.680618Z 0 [BŁĄD] Błąd krytyczny: Nie można otworzyć i zablokować tabel uprawnień: Mechanizm przechowywania tabel dla „użytkownika” nie ma tej opcji
dziennik kompilacji (dla kompletu 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
dziwna kontynuacja
Po eksperymentach opisanych w mojej próbie odpowiedzi utworzyłem skrypt powłoki, który wykonuje polecenie
select count(*)
zapytanie do każdej tabeli w przestrzeni mysql trzy razy z rzędu (ponieważ eksperymenty pokazują, że w niektórych tabelach zapytanie nie powiedzie się dokładnie dwa razy :-().
Następnie
mysql_upgrade
i
service mysql restart
jest próbowany. W Dockerfile
skrypcie jest udostępniany za pośrednictwem
COPY mysqltest.sh .
Próby z tym skryptem dają dziwne / szalone wyniki.
Ponieważ
Docker environment
start wciąż się nie udaje[BŁĄD] Błąd krytyczny: Nie można otworzyć i zablokować tabel uprawnień: Mechanizm przechowywania tabel dla „użytkownika” nie ma tej opcji
Uruchamianie skryptu
sh mysqltest.sh root
w
docker environment
prowadzi do2017-08-27T09: 12: 47.021528Z 12 [BŁĄD] / usr / sbin / mysqld: Tabela „./mysql/db” jest oznaczony jako uszkodzony i powinien zostać naprawiony
2017-08-27T09: 12: 47.050141Z 12 [BŁĄD ] Nie można naprawić tabeli: mysql.db
2017-08-27T09: 12: 47.055925Z 13 [BŁĄD] / usr / sbin / mysqld: Tabela „./mysql/db” jest oznaczona jako
rozbita i powinna zostać naprawiona 2017-08 -27T09: 12: 47.407700Z 54 [ERROR] / usr / sbin / mysqld: Table './mysql/proc' jest oznaczony jako rozbity i powinien zostać naprawiony
2017-08-27T09: 12: 47.433516Z 54 [ERROR] Couldn ' Tabela naprawy: mysql.proc
2017-08-27T09: 12: 47.440695Z 55 [BŁĄD] / usr / sbin / mysqld: Tabela „./mysql/proc” jest oznaczona jako
rozbita i powinna zostać naprawiona 2017-08-27T09: 12: 47.769485Z 81 [BŁĄD] / usr / sbin / mysqld: Table './mysql/tables_priv'jest oznaczony jako rozbity i powinien zostać naprawiony
2017-08-27T09: 12: 47.792061Z 81 [BŁĄD] Nie można naprawić tabeli: mysql.tables_priv
2017-08-27T09: 12: 47.798472Z 82 [BŁĄD] / usr / sbin / mysqld: Table './mysql/ table_priv ”jest oznaczony jako rozbity i powinien zostać naprawiony
2017-08-27T09: 12: 47.893741Z 99 [ERROR] / usr / sbin / mysqld: Table './mysql/user' jest oznaczony jako rozbity i powinien zostać naprawiony
2017-08 -27T09: 12: 47.914288Z 99 [BŁĄD] Nie można naprawić tabeli: mysql.user
2017-08-27T09: 12: 47.920459Z 100 [BŁĄD] / usr / sbin / mysqld: Tabela „./mysql/user” to oznaczony jako rozbity i powinien zostać naprawiony
Co się tutaj dzieje, aby spowodować to dziwne zachowanie?
Odpowiedzi:
Wpadłem dzisiaj na ten sam problem. Korzystam z usługi MySQL podczas kompilacji dokera w celu przeprowadzenia testów jednostkowych, a aktualizacja do MySQL CE 5.7.19 z MariaDB przerwała kompilację. To, co rozwiązało problem, działało za
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
każdym razem przed uruchomieniem usługi mysql.Mój plik Docker wygląda teraz tak:
Mam nadzieję że to pomoże.
źródło
chmod
polecenie. Kompilacja kończy się powodzeniem, gdy uruchamiam ją na zdalnym serwerze Ubuntu, ale kończy się niepowodzeniem, gdy uruchamiam ją na moim komputerze lokalnym (OS X). Dodaniechmod
polecenia do potomnego Dockerfile rozwiązało problem. Dziwne .Obejście
Opis problemu
Podstawowy problem wskazany przez aalexgabi wynika z implementacji standardów OverlayFS POSIX :
Odniesienie:
źródło
Potwierdziłem błąd w overlayfs (overlay2), który jest domyślny w Docker na Mac. Błąd występuje podczas uruchamiania mysql na obrazie, po utworzeniu obrazu za pomocą mysql.
Przejście na „aufs” rozwiązało problem. (W Docker dla komputerów Mac „daemon.json” można edytować, wybierając menu „Preferencje ...”, a następnie zakładkę „Daemon” i zakładkę „Zaawansowane”).
/etc/docker/daemon.json:
Ref:
https://github.com/moby/moby/issues/35503
https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028
źródło
Oto odpowiedź, której jeszcze tu nie widzę.
Dodaj to do pliku dokera:
VOLUME /var/lib/mysql
Spowoduje to, że folder / var / lib / mysql będzie używał rodzimego systemu plików zamiast overlayFS. To omija ten problem.
Jest to rozwiązanie, którego używa oficjalny obraz dokera mysql, aby sobie z tym poradzić, jak widać tutaj: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile
źródło
To może jeszcze nie być rozwiązaniem. W każdym razie może to wskazywać innym na „właściwą” odpowiedź
Poniższy dziennik sesji bash Dockera pokazuje sekwencję kroków, które prowadzą do dziwnych błędów i ostatecznie są w stanie poprawnie uruchomić demona mysql w środowisku dokera.
Próba uruchomienia demona w tej sesji kończy się niepowodzeniem dwa razy - raz z powodu tabeli mysql.user i raz z powodu tabeli mysql.db. Uruchamianie demona mysql z opcją --skip-grant-tables działa, ale występują również problemy z prostym wyborem * z poleceń w tych tabelach.
Dziwnie robię dwa proste zapytania:
a następnie zabicie demona, aby poprawnie go uruchomić
wydaje się działać. Spróbuję teraz zautomatyzować to rozwiązanie. Wciąż szukam „właściwego” rozwiązania problemu i mam pewne wskazówki, co jest przyczyną tego dziwnego zachowania.
Plik Docker
dziennik kompilacji
dziennik sesji bash
źródło