mysql5.7在docker中第一次运行时出错
2023年5月21日大约 2 分钟
上一级页面:index-la
前言
跟着谷粒商城里教的,使用docker运行mysql5.7版本,结果出现了报错
记录
首先使用docker命令查看出错时记录的日志,mysql是我给容器设置的name,下面命令里的mysql
就是容器名称
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
查看日志
docker logs mysql
发现mysql报错如下
mysqld:Can’t read dir of ‘/etc/mysql/conf.d’
(Errcode:13 -Permission denied) mysqld:[ERROR]Fat
Permission denied 是权限不足的意思,在容器的运行命令加上 下面的后缀即可
-–privileged=true
另外一种常见报错是
# mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘ (Errcode: 2 - No such file or directory
翻译过来就是mysql找不到/etc/mysql/conf.d/
这个文件夹
而我们docker的运行命令里,将/etc/mysql
挂载到了宿主机(host)的/mydata/mysql/conf
# docker run的命令如下
-v /mydata/mysql/conf:/etc/mysql
所以问题就演变成了,在宿主机的/mydata/mysql/conf
文件夹下找不到conf.d
这个文件夹,即找不到
/mydata/mysql/conf/conf.d
解决方案
知道了问题所在,给出解决方案如下:
docker在挂在目录的时候出现了问题,mysql需要找到 /etc/mysql/conf.d
和 /etc/mysql/mysql.conf.d
这两个文件夹,
因为挂载到了host机内,就变成了,mysql 会去找host机的 /mydata/mysql/conf/
目录下对应的这两个文件夹
/mydata/mysql/conf/conf.d
/mydata/mysql/conf/mysql/mysql.conf.d
因为没有这两个文件夹,我们需要手动创建一个,这里给出最简单的解决方案是,
使用docker命令,从临时的mysql容器里,把这两个文件夹复制出来,具体命令如下
# 启动一个没有挂载的mysql容器
docker run -it --name temp mysql:5.7 /bin/bash
# 检查是否有这两个文件夹
bash-4.2# ls /etc/mysql/
conf.d mysql.conf.d
#退出容器
exit
# 删除原来创建的mysql配置文件夹
sudo rm -rf /mydata/mysql
# 在host机里创建文件夹
sudo mkdir -p /mydata/mysql/conf/
# 将文件夹下的目录 拷贝出来,最好是挂载的目录,后面根据自己挂载路径进行调试
sudo docker cp temp:/etc/mysql /mydata/mysql
# 检查是否从容器里把文件复制出来
ls /mydata/mysql
# 去到目录下
cd /mydata/mysql/
# 移动文件夹内容到新文件夹
mv mysql conf
# 检查是否从容器里把文件复制出来
ll /mydata/mysql/conf/
# 返回如下
[vagrant@localhost mysql]$ ll /mydata/mysql/conf/
total 0
drwxr-xr-x. 2 root root 6 Oct 27 16:51 conf.d
drwxr-xr-x. 2 root root 6 Oct 27 16:51 mysql.conf.d
这样问题就解决了,接下来重新初始化运行容器
# 先删除原有容器
docker rm mysql
# 接着运行命令
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
# 检查是否成功运行
docker ps
# 成功运行后,最后删除临时创建的mysql容器
docker rm temp