Это сообщение об ошибке появляется, когда я использую ubuntu 16.04 и последнюю версию mysql 5.7.19-0ubuntu0.16.04.1 в образе Docker.
Что можно сделать, чтобы это исправить?
Воспроизвести ошибку
Получить
Dockerfile
:FROM ubuntu:16.04 RUN apt update RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
(также доступно здесь )
Сборка и запуск:
docker build -t mysqlfail . docker run -it mysqlfail tail -1 /var/log/mysql/error.log
был бы показан следующий журнал ошибок:
2017-08-26T11: 48: 45.398445Z 1 [Предупреждение] root @ localhost создан с пустым паролем! Пожалуйста, рассмотрите возможность отключения опции --initialize-insecure.
Это было именно то, что мы хотели: mysql без пароля root.
В прошлом (Ubuntu 14.04 / MySQL 5.5)
service mysql start
было возможно. Теперь, если вы попробуете это, это не удастсяdocker run -it mysqlfail service mysql start * Starting MySQL database server mysqld No directory, logging in with HOME=/ [fail]
и
/var/log/mysql/error.log
содержит строку:2017-08-26T11: 59: 57.680618Z 0 [ОШИБКА] Неустранимая ошибка: невозможно открыть и заблокировать таблицы привилегий: механизм хранения таблиц для пользователя не имеет этой опции
Журнал сборки (для полного 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
странное продолжение
После экспериментов, описанных в моей попытке ответа , я создал сценарий оболочки, который выполняет
select count(*)
запрос к каждой таблице в пространстве mysql три раза подряд (поскольку эксперименты показывают, что для некоторых таблиц запрос завершится с ошибкой ровно дважды :-().
Потом
mysql_upgrade
и
service mysql restart
испробован В Dockerfile
скрипте сделан доступным через
COPY mysqltest.sh .
Испытания с этим сценарием дают странные / безумные результаты.
Для
Docker environment
начала все еще не удается[ОШИБКА] Неустранимая ошибка: невозможно открыть и заблокировать таблицы привилегий: механизм хранения таблиц для пользователя не имеет этой опции
Запуск сценария
sh mysqltest.sh root
в
docker environment
приводит к2017-08-27T09: 12: 47.021528Z 12 [ОШИБКА] / usr / sbin / mysqld: Таблица './mysql/db' помечена как
неисправная и должна быть исправлена 2017-08-27T09: 12: 47.050141Z 12 [ОШИБКА ] Не удалось восстановить таблицу: mysql.db
2017-08-27T09: 12: 47.055925Z 13 [ОШИБКА] / usr / sbin / mysqld: Таблица './mysql/db' помечена как
аварийная и должна быть исправлена 2017-08 -27T09: 12: 47.407700Z 54 [ОШИБКА] / usr / sbin / mysqld: Таблица './mysql/proc' помечена как
неисправная и должна быть исправлена 2017-08-27T09: 12: 47.433516Z 54 [ОШИБКА] Не удалось ' t таблица восстановления: mysql.proc
2017-08-27T09: 12: 47.440695Z 55 [ОШИБКА] / usr / sbin / mysqld: Таблица './mysql/proc' помечена как
аварийная и должна быть исправлена 2017-08-27T09: 12: 47.769485Z 81 [ОШИБКА] / usr / sbin / mysqld: Таблица './mysql/tables_priv'помечен как разбившийся и должен быть отремонтирован
2017-08-27T09: 12: 47.792061Z 81 [ОШИБКА] Не удалось восстановить таблицу: mysql.tables_priv
2017-08-27T09: 12: 47.798472Z 82 [ОШИБКА] / usr / sbin / mysqld: Таблица './mysql/ tables_priv 'помечен как аварийный и должен быть исправлен
2017-08-27T09: 12: 47.893741Z 99 [ОШИБКА] / usr / sbin / mysqld: Таблица' ./mysql/user 'помечена как
аварийная и должна быть восстановлена 2017-08-08 -27T09: 12: 47.914288Z 99 [ОШИБКА] Не удалось восстановить таблицу: mysql.user
2017-08-27T09: 12: 47.920459Z 100 [ОШИБКА] / usr / sbin / mysqld: Таблица './mysql/user' is помечен как разбившийся и должен быть отремонтирован
Что здесь происходит, чтобы вызвать это странное поведение?
Ответы:
Столкнулся с той же проблемой сегодня. Я запускаю службу MySQL во время сборки докера для модульных тестов, а обновление до MySQL CE 5.7.19 от MariaDB прервало сборку. То, что решило проблему для меня, запускалось
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
каждый раз перед запуском службы mysql.Итак, мой Dockerfile теперь выглядит так:
Надеюсь это поможет.
источник
chmod
команду. Сборка завершается успешно, когда я запускаю ее на удаленном сервере Ubuntu, но не удается, когда я запускаю ее на своей локальной машине (OS X). Добавлениеchmod
команды в дочерний Dockerfile решило проблему. Странно .Временное решение
Описание проблемы
Основная проблема, заявленная aalexgabi , связана с реализацией стандартов POSIX для OverlayFS :
Ссылка:
источник
Я подтвердил ошибку на overlayfs (overlay2), которая по умолчанию установлена в Docker для Mac. Ошибка происходит при запуске mysql на изображении, после создания изображения с помощью mysql.
Переход на «aufs» решил проблему. (В Docker для Mac файл «daemon.json» можно редактировать, выбрав меню «Предпочтения ...», вкладку «Демон» и вкладку «Дополнительно».)
/etc/docker/daemon.json:
Ref:
https://github.com/moby/moby/issues/35503
https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028
источник
Вот ответ, которого я пока не вижу здесь.
Добавьте это в ваш dockerfile:
VOLUME /var/lib/mysql
Это заставит папку / var / lib / mysql использовать собственную файловую систему, а не overlayFS. Это обходит эту проблему.
Это решение, используемое официальным образом Docker для MySQL, как вы можете увидеть здесь: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile
источник
Возможно, это еще не совсем решение. В любом случае это может указывать другим на «правильный» ответ
В журнале сеанса Docker Bash ниже показана последовательность шагов, которые приводят к странным ошибкам и, наконец, к возможности правильно запустить демон mysql в среде Docker.
Попытка запустить демон в этом сеансе не удалась дважды - один раз из-за таблицы mysql.user и один раз из-за таблицы mysql.db. Запуск демона mysql с --skip-grant-tables работает, но есть также проблемы с простым выбором команд * в этих таблицах.
Странно делать два простых запроса:
а затем убить демона, чтобы запустить его правильно с
похоже на работу. Сейчас я попытаюсь автоматизировать это в качестве обходного пути. Я все еще ищу «правильное» решение проблемы, и некоторые понимают, в чем причина такого странного поведения.
Dockerfile
построить журнал
журнал сессии bash
источник