Este mensaje de error aparece cuando uso ubuntu 16.04 y el último mysql 5.7.19-0ubuntu0.16.04.1 en una imagen de Docker.
¿Qué se podría hacer para arreglar esto?
Para reproducir el error
Obtén el
Dockerfile
:FROM ubuntu:16.04 RUN apt update RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
(también disponible aquí )
Construye y ejecuta:
docker build -t mysqlfail . docker run -it mysqlfail tail -1 /var/log/mysql/error.log
se le habría mostrado el siguiente registro de errores:
2017-08-26T11: 48: 45.398445Z 1 [Advertencia] root @ localhost se crea con una contraseña vacía. Considere desactivar la opción --initialize-insecure.
Que era exactamente lo que queríamos: un mysql sin contraseña de root establecida todavía.
En el pasado (ubuntu 14.04 / mysql 5.5) a
service mysql start
era posible. Ahora si intentas esto falladocker run -it mysqlfail service mysql start * Starting MySQL database server mysqld No directory, logging in with HOME=/ [fail]
y
/var/log/mysql/error.log
contiene una línea:2017-08-26T11: 59: 57.680618Z 0 [ERROR] Error grave: no se pueden abrir y bloquear tablas de privilegios: el motor de almacenamiento de tablas para 'usuario' no tiene esta opción
registro de compilación (para el completo 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
continuación extraña
Después de los experimentos como se describe en mi intento de respuesta , creé un script de shell que hace un
select count(*)
consulta en cada tabla en el espacio mysql tres veces seguidas (porque los experimentos muestran que en algunas tablas la consulta fallará exactamente dos veces :-().
Entonces un
mysql_upgrade
y el
service mysql restart
es probado En el Dockerfile
guión está disponible a través de
COPY mysqltest.sh .
Las pruebas con este script dan resultados extraños / locos.
Para el
Docker environment
comienzo todavía falla[ERROR] Error grave: no se pueden abrir y bloquear tablas de privilegios: el motor de almacenamiento de tablas para 'usuario' no tiene esta opción
Ejecutando el script
sh mysqltest.sh root
en las
docker environment
pistas para2017-08-27T09: 12: 47.021528Z 12 [ERROR] / usr / sbin / mysqld: la tabla './mysql/db' está marcada como
bloqueada y debe repararse 2017-08-27T09: 12: 47.050141Z 12 [ERROR ] No se pudo reparar la tabla: mysql.db
2017-08-27T09: 12: 47.055925Z 13 [ERROR] / usr / sbin / mysqld: la tabla './mysql/db' está marcada como
bloqueada y debe repararse 2017-08 -27T09: 12: 47.407700Z 54 [ERROR] / usr / sbin / mysqld: la tabla './mysql/proc' está marcada como
bloqueada y debe repararse 2017-08-27T09: 12: 47.433516Z 54 [ERROR] no se pudo ' t tabla de reparación: mysql.proc
2017-08-27T09: 12: 47.440695Z 55 [ERROR] / usr / sbin / mysqld: la tabla './mysql/proc' está marcada como
bloqueada y debe repararse 2017-08-27T09: 12: 47.769485Z 81 [ERROR] / usr / sbin / mysqld: Tabla './mysql/tables_priv'está marcado como bloqueado y debe repararse
2017-08-27T09: 12: 47.792061Z 81 [ERROR] No se pudo reparar la tabla: mysql.tables_priv
2017-08-27T09: 12: 47.798472Z 82 [ERROR] / usr / sbin / mysqld: Table './mysql/ tables_priv 'está marcado como bloqueado y debe repararse
2017-08-27T09: 12: 47.893741Z 99 [ERROR] / usr / sbin / mysqld: Table' ./mysql/user 'está marcado como
bloqueado y debe repararse 2017-08 -27T09: 12: 47.914288Z 99 [ERROR] No se pudo reparar la tabla: mysql.user
2017-08-27T09: 12: 47.920459Z 100 [ERROR] / usr / sbin / mysqld: La tabla './mysql/user' es marcado como estrellado y debe repararse
¿Qué está pasando aquí para causar este extraño comportamiento?
Respuestas:
Me encontré con el mismo problema hoy. Estoy ejecutando el servicio MySQL durante la compilación de Docker para las pruebas unitarias y la actualización a MySQL CE 5.7.19 de MariaDB rompió la compilación. Lo que resolvió el problema para mí se ejecutaba
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
cada vez antes de iniciar el servicio mysql.Entonces mi Dockerfile se ve así ahora:
Espero que esto ayude.
fuente
chmod
comando. La compilación tiene éxito cuando lo ejecuto en un servidor Ubuntu remoto, pero falla cuando lo ejecuto en mi máquina local (OS X). Agregar elchmod
comando al archivo Docker secundario solucionó el problema. Extraña .Confirmé el error en overlayfs (overlay2) que es el predeterminado en Docker para Mac. El error ocurre al iniciar mysql en la imagen, después de crear una imagen con mysql.
Cambiar a "aufs" resolvió el problema. (En Docker para Mac, el "daemon.json" se puede editar seleccionando el menú "Preferencias ...", seleccionando la pestaña "Daemon" y seleccionando la pestaña "Avanzado".
/etc/docker/daemon.json:
Árbitro:
https://github.com/moby/moby/issues/35503
https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028
fuente
Solución alterna
Descripción del problema
El problema subyacente según lo establecido por aalexgabi se debe a la implementación de los estándares POSIX de OverlayFS :
Referencia:
fuente
Aquí hay una respuesta que aún no veo aquí.
Agregue esto a su dockerfile:
VOLUME /var/lib/mysql
Esto hará que la carpeta / var / lib / mysql use el sistema de archivos nativo en lugar de overlayFS. Esto evita este problema.
Esta es la solución que utiliza la imagen oficial de MySQL Docker para tratar esto, como puede ver aquí: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile
fuente
Esta podría no ser la solución todavía. De todos modos, podría señalar a otros una respuesta "adecuada"
El registro de la sesión de docker bash a continuación muestra una secuencia de pasos que conducen a errores extraños y finalmente poder iniciar el demonio mysql correctamente en el entorno de docker.
Intentar iniciar el demonio en esta sesión falla dos veces: una debido a la tabla mysql.user y otra debido a la tabla mysql.db. Ejecutar el demonio mysql con --skip-grant-tables funciona pero también hay problemas con la simple selección * de los comandos en estas tablas.
Extrañamente haciendo dos consultas simples:
y luego matando al demonio para comenzarlo correctamente con
parece funcionar. Ahora intentaré automatizar esto como una solución alternativa. Todavía estoy buscando una solución "adecuada" para el problema y alguna idea de cuál es la razón de este extraño comportamiento.
Dockerfile
registro de compilación
registro de sesión bash
fuente