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

我正在使用Docker-Compose和MySQL Image来启动一个MySQL数据库,作为大型项目的一部分。

正如MySQL映像文档中所述,我将自定义configuration文件映射到/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到所需的位置:

 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 " 

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

使用-v ,– --volumes或使用--volumes启动容器时volumes:docker-compose.yml

 docker run -v source:/dest:rw busybox ls -l /dest 

Docker将来自Linux VMsource目录挂载到一个容器中作为/dest 。 Docker装入卷只提供自己的选项rwr ,我认为z为selinux。 所有者和权限信息将完全按照Linux VM所看到的那样传递给容器。 如果克隆你的docker-compose从他们的本地主机而不是VM上运行dockerdocker-compose ,他们将挂载空白的目录。

Docker机器的Users共享

docker-machine创build的本地虚拟机将默认共享您的计算机的本地用户目录。 C:\Users Windows上的/Users和OSX上的/Users 。 这是作为VirtualBox共享文件夹称为Users 。 然后这个共享通过VirtualBox的vboxsf挂载工具作为/Users或者可能/c/Users通过Linux启动脚本/etc/rc.d/vbox安装在Linux端。

当你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挂载的共享。

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并将选项附加到mountOptionsvariables。 这些选项将应用于该装载上/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 

如果您升级或重新创build您的docker-machine虚拟机,您将需要重新执行此操作。

我倾向于跳过依赖virtualbox共享,并在变化(fsevents和rsync)上监视和同步本地文件到我的主机。