Windows上Docker中的MySQL:忽略世界可写文件

Windows上Docker中的MySQL:忽略世界可写文件,mysql,docker,docker-compose,Mysql,Docker,Docker Compose,我正在使用Docker Compose with启动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"

我正在使用Docker Compose with启动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'ing到所需位置,作为启动命令的一部分:

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
启动容器时,或者使用
docker compose.yml中的
volumes:

docker run -v source:/dest:rw busybox ls -l /dest
Docker将Linux VM中的
目录作为
/dest
装载到一个容器中。Docker安装的卷只提供它们自己的选项
rw
r
,我认为selinux的
z
。所有者和权限信息将完全按照Linux虚拟机看到的方式传递到容器。如果克隆您的repo的人从本地主机而不是虚拟机上运行
docker
docker compose
,他们将挂载空白目录

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

当您使用
docker machine ssh default
时,您应该能够在
/Users/nwinkler
上查看所有计算机文件

此共享允许
docker compose
引用
C:\Users
中的相对本地目录,并使其在Linux虚拟机上工作。在
C:\Users
之外,虚拟机上不存在数据

世界可读文件 我相信您看到的是vboxsf的POSIX表示的Windows文件系统。如果您运行:

docker-machine ssh default
$ cd /Users/nwinkler/path/to/mysql-docker
$ ls -l
$ docker run -v $PWD:/mysql busybox ls -l /mysql
您应该将所有文件都视为世界可写文件。更改所表示权限的唯一方法是通过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虚拟机上,编辑
/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
如果您升级或重新创建docker机器VM,您需要再次执行此操作


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

在上述场景中我将如何使用它?我无法在docker compose文件中提供
fmode
作为选项。。。
/etc/rc.d/vbox
文件只设置了
mountOptions
变量,以便与自动装入的
/Users
卷一起使用,我认为它没有将其用于任何其他卷。如何为docker compose装载的卷应用不同的
fmask
值?装载docker卷(从docker主机到容器)仅提供
rw/r
选项,否则docker卷将通过docker主机上的任何权限。这个答案纯粹与将VM主机用户目录装载到VM有关。是
“/mysql/conf.d/
正在从
C:/Users
share装载到容器中?您是否在Windows中访问/编辑这些文件?是的,在Windows中访问/编辑这些文件,以便在MySQL容器启动时向其添加数据。容器运行后,将不再在Windows上编辑文件。文件的位置不是预定义的,它们位于用户克隆持有Docker Compose repo的Git repo的任何位置。它可能位于
C:/Users
下,但也可能位于用户计算机上的其他位置。好的。。用户无法将您的repo克隆到任意OSX/Windows位置并将其装载到容器中。这只在
c:\users
内部起作用。我将添加一些docker卷和docker机器共享详细信息。@nwinkler希望编辑能填补我所忽略的部分。