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 VM的source
目录挂载到一个容器中作为/dest
。 Docker装入卷只提供自己的选项rw
和r
,我认为z
为selinux。 所有者和权限信息将完全按照Linux VM所看到的那样传递给容器。 如果克隆你的docker-compose
从他们的本地主机而不是VM上运行docker
或docker-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
并将选项附加到mountOptions
variables。 这些选项将应用于该装载上/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)上监视和同步本地文件到我的主机。