问题
Docker 拉起官方的 MySQL容器,指定使用挂载的配置文件时,报错如下:
mysql: [Warning] World-writable config file '/etc/mysql/conf.d/mysql.cnf' is ignored.
解决否
已解决
方案
这其实是 Docker 在 Windows 下的坑! 当然了 Docker for Mac 也遇到同样的问题。
这牵涉到MySQL对配置文件的可见性安全性的一个要求。MySQL希望它的配置文件是不可编辑的,可查看不可写的。所以就需要配置对应的umask
0555.
以上问题在特定环境下才会暴露出来。我这边是 Mac OS
从宿主机的磁盘一路挂载到vbox,再挂载到Docker,垮了3个环境。为了方便,我直接umask就是 0777。
因为需要在宿主机上编辑代码,Docker环境内运行测试代码。
Windows 上环境我也试过,宿主机挂载到vbox,vbox里装了一个Ubuntu虚拟机,虚拟机内安装了Dcoker,也是跨了3个环境,Windows的磁盘和Linux的权限管理是两套体系,所以
umask
就直接在vbox上配置了。
那么现在MySQL容器需要的是 0555 权限,我尝试在Ubuntu虚拟机中将挂载的目录的访问权限改为 0555,但没有成功,改不动。
具体原因没有深究, 网上也查阅了很多方案,都试了没成功,接下来是我自己摸索出来方案。
我的解决方案是这样:
把同一个目录在vbox里面的Ubuntu虚拟机内挂载了两次,也就是同一个文件夹挂载了两个文件夹,然后两个文件夹的umask 不一样。
配置如下:
sudo mount -t vboxsf -o umask=000,dmode=777,fmode=777 Jumei /mnt/vbox
sudo mount -t vboxsf -o umask=222 Jumei /mnt/ro-vbox
这样,你挂载代码啊,MySQL的数据目录/var/lib/mysql/
,就挂载0777目录——/mnt/vbox
下,当需要挂载只读配置文件时,Docker volume就挂载 /mnt/ro-vbox
目录,这样就满足了配置文件只读,数据文件读写的配置要求。
以下是样例:
file: ./docker-compose.yaml
version: "2"
mysql:
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- /mnt/ro-vbox/compose/bs/config/mysql/my.cnf:/etc/mysql/my.cnf:ro
- /mnt/ro-vbox/compose/bs/config/mysql/conf.d:/etc/mysql/conf.d:ro
- /mnt/vbox/compose/bs/mysql/:/var/lib/mysql/:rw
- /mnt/vbox/compose/bs/log/mysql/:/var/log/mysql/:rw
environment:
MYSQL_ROOT_PASSWORD: "123456"
networks:
tasker_net:
ipv4_address: "192.168.0.6"