当我在 Docker 映像中使用 ubuntu 16.04 和最新的 mysql 5.7.19-0ubuntu0.16.04.1 时,会出现此错误消息。
可以做些什么来解决这个问题?
重现错误
获取
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 选项。
这正是我们想要的:一个尚未设置 root 密码的 mysql。
在过去(ubuntu 14.04 / mysql 5.5)a
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
奇怪的继续
在我的回答尝试中概述的实验之后,我创建了一个 shell 脚本,它执行
select count(*)
对 mysql 空间中的每个表连续查询 3 次(因为实验表明,在某些表上,查询将完全失败两次 :-( )。
然后一个
mysql_upgrade
和
service mysql restart
被尝试。在Dockerfile
脚本中通过
COPY mysqltest.sh .
这个脚本的试验给出了奇怪/疯狂的结果。
对于
Docker environment
开始仍然失败[错误] 致命错误:无法打开和锁定特权表:“用户”的表存储引擎没有此选项
运行脚本
sh mysqltest.sh root
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 -27T09:12:47.914288Z 99 [错误] 无法修复表:mysql.user
2017-08-27T09:12:47.920459Z 100 [错误] /usr/sbin/mysqld: 表 './mysql/user' 是标记为崩溃,应该修复
这里发生了什么导致这种奇怪的行为?
今天遇到了同样的问题。我在 docker build 期间为单元测试运行 MySQL 服务,并从 MariaDB 升级到 MySQL CE 5.7.19 破坏了构建。每次启动mysql服务之前,为我解决问题的是
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
每次运行。所以我的 Dockerfile 现在看起来像这样:
希望这可以帮助。
解决方法
问题描述
aalexgabi所述的潜在问题是由于实施了 OverlayFS 的 POSIX 标准:
参考:
我确认了overlayfs(overlay2)上的错误,这是Docker for Mac的默认设置。在使用 mysql 创建映像后,在映像上启动 mysql 时发生错误。
切换到“aufs”解决了这个问题。(在 Docker for Mac 上,可以通过选择“Preferences...”菜单,选择“Daemon”选项卡,然后选择“Advanced”选项卡来编辑“daemon.json”。)
/etc/docker/daemon.json :
参考:
https://github.com/moby/moby/issues/35503
https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028
这是我在这里还没有看到的答案。
将此添加到您的 dockerfile:
VOLUME /var/lib/mysql
这将导致 /var/lib/mysql 文件夹使用本机文件系统而不是 overlayFS。这绕过了这个问题。
这是官方 mysql docker 映像用来处理此问题的解决方案,您可以在此处看到:https ://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile
这可能还不是解决方案。无论如何,它可能会将其他人指向“正确”的答案
下面的 docker bash 会话日志显示了一系列导致奇怪错误的步骤,最终能够在 docker 环境中正确启动 mysql 守护程序。
尝试在此会话中启动守护程序失败两次 - 一次是由于 mysql.user 表,一次是由于 mysql.db 表。使用 --skip-grant-tables 运行 mysql 守护进程是可行的,但在这些表上使用简单的 select * from 命令也存在问题。
奇怪地做了两个简单的查询:
然后杀死守护进程以正确启动它
似乎工作。我现在将尝试将其自动化作为一种解决方法。我仍在寻找解决该问题的“适当”解决方案,并了解这种奇怪行为的原因是什么。
Dockerfile
构建日志
bash 会话日志