Windows上Docker中的MySQL:忽略了全局可写文件

时间:2016-02-12 16:46:23

标签: mysql docker docker-compose

我使用Docker-Compose和MySQL Image一起启动MySQL数据库,作为更大项目的一部分。

如MySQL图像文档中所述,我在自定义配置文件中映射到/etc/mysql/conf.d/config-file.cnf

database:
  environment:
    MYSQL_ROOT_PASSWORD: foo
  ports:
    - "3306:3306"
  volumes:
    - "./mysql/conf.d/:/etc/mysql/conf.d"
  image: mysql:5.5

在Mac OS X上作为主机系统(使用docker-machine)运行时,此功能完全正常,但在Windows上运行时也失败(同样使用docker-machine)。 MySQL抱怨/etc/mysql/conf.d/config-file.cnf是世界可写的

这一事实
Warning: World-writable config file '/etc/mysql/conf.d/config-file.cnf' is ignored 

进入数据库容器时,该文件确实显示为具有0777权限。这似乎是由于主机文件系统的权限(Windows)。

有没有办法改变这个?我尝试在只读模式下安装卷,但该文件仍具有相同的权限。

还有其他解决这个问题的方法吗?目前,我将文件安装到容器中的另一个文件夹中,然后将/ chmod将其作为启动命令的一部分复制/ chmod到所需位置:

database:
  environment:
    MYSQL_ROOT_PASSWORD: foo
  ports:
    - "3306:3306"
  volumes:
    - "./mysql/conf.d/:/usr/local/mysqlconf"
  image: mysql:5.5
  command: >
    bash -c "

    cp /usr/local/mysqlconf/*.cnf /etc/mysql/conf.d/
    && chmod 644 /etc/mysql/conf.d/*.cnf
    && /entrypoint.sh mysqld
    "

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

当您在-v

中启动包含--volumesvolumes:docker-compose.yml的容器时
docker run -v source:/dest:rw busybox ls -l /dest

Docker将{em> Linux VM 中的source目录挂载到/dest的容器中。 Docker挂载的卷只提供自己的选项rwr,我认为z适用于selinux。所有者和权限信息将完全按照Linux VM看到的那样传递到容器。如果克隆您的仓库的人从其本地主机而不是VM上运行dockerdocker-compose,则会挂载空白目录。

Docker Machine' Users分享

默认情况下,docker-machine创建的本地VM将共享您计算机的本地用户目录。 Windows上为C:\Users,OSX上为/Users。这是作为名为Users的VirtualBox共享文件夹完成的。然后,此共享通过VirtualBox的vboxsf安装工具/Users安装在Linux端,或者通过Linux启动脚本/c/Users安装/etc/rc.d/vbox

当您docker-machine ssh default时,您应该能够在/Users/nwinkler看到所有计算机文件。

此共享允许docker-compose引用C:\Users中的相对本地目录,并使其在Linux VM上运行。在C:\Users之外,VM上不存在数据。

世界可读文件

我相信你所看到的是vboxsf的Windows文件系统的POSIX表示。如果您运行:

docker-machine ssh default
$ cd /Users/nwinkler/path/to/mysql-docker
$ ls -l
$ docker run -v $PWD:/mysql busybox ls -l /mysql

您应该看到所有文件都是可写的。更改表示权限的唯一方法是通过vboxsf挂载共享。

mount options vboxsf提供的是:

Available mount options are:
     rw                 mount writable (the default)
     ro                 mount read only
     uid=UID            set the default file owner user id to UID
     gid=GID            set the default file owner group id to GID
     ttl=TTL            set the "time to live" to TID for the dentry
     dmode=MODE         override the mode of all directories to (octal) MODE
     fmode=MODE         override the mode of all regular files to (octal) MODE
     umask=UMASK        set the umask to (octal) UMASK
     dmask=UMASK        set the umask applied to directories only
     fmask=UMASK        set the umask applied to regular files only
     iocharset CHARSET  use the character set CHARSET for I/O operations
                        (default set is utf8)
     convertcp CHARSET  convert the folder name from CHARSET to utf8

在Docker Linux VM上,编辑/etc/rc.d/box并将选项附加到mountOptions变量。这些选项将应用于该安装上/Users下的所有文件和目录。

您可以设置fmask=007以从所有文件中删除其他权限,或fmode=750覆盖所有文件的所有权限。

mountOptions='defaults,iocharset=utf8'
if grep -q '^docker:' /etc/passwd; then
    mountOptions="${mountOptions},uid=$(id -u docker),gid=$(id -g docker),fmask=007"
fi

如果您升级或重新创建泊坞机VM,则需要再次执行此操作。

我倾向于跳过依赖虚拟机共享并在更改时监视本地文件并将其同步到我的主机(fsevents和rsync)。