我使用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
"
有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
当您在-v
--volumes
,volumes:
或docker-compose.yml
的容器时
docker run -v source:/dest:rw busybox ls -l /dest
Docker将{em> Linux VM 中的source
目录挂载到/dest
的容器中。 Docker挂载的卷只提供自己的选项rw
和r
,我认为z
适用于selinux。所有者和权限信息将完全按照Linux VM看到的那样传递到容器。如果克隆您的仓库的人从其本地主机而不是VM上运行docker
或docker-compose
,则会挂载空白目录。
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)。