gpt4 book ai didi

Windows 上 Docker 中的 MySQL : World-writable files ignored

转载 作者:行者123 更新时间:2023-11-29 02:51:17 24 4
gpt4 key购买 nike

我正在使用 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)。

有什么办法可以改变吗?我已尝试以只读模式装载该卷,但该文件仍然具有相同的权限。

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

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 将 source 目录从 Linux VM 挂载到容器中作为 /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 挂载工具将此共享挂载到 Linux 端,作为 /Users/c/Users 通过 Linux 启动脚本 /etc/rc.d/vbox.

当你docker-machine ssh default时,你应该能够在/Users/nwinkler看到你所有的电脑文件。

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

全局可读文件

我相信您看到的是 Windows 文件系统的 vboxsf 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 以从所有文件中删除 other 权限,或设置 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-machine VM,您将需要再次执行此操作。

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

关于Windows 上 Docker 中的 MySQL : World-writable files ignored,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com