MySQL Docker 配置文件挂载 问题

跨虚拟机Docker环境下,拉起MySQL挂载磁盘是,估计大家都会遇到的问题

问题

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"