【问题标题】:Permission denied when mounting Docker volume in OSX在 OSX 中挂载 Docker 卷时权限被拒绝
【发布时间】:2016-03-30 07:27:26
【问题描述】:

我对此束手无策,所以希望你们能帮助我。在带有 docker-machine 的 OSX 10.11.2 中,我有一个 docker-compose 文件,它应该构建一个本地 Dockerfile 并将一个 MySQL 容器附加到它上面。 MySQL 容器应该挂载一个本地文件夹来存储我的数据库数据,因此如果容器或 VM 出现故障,我可以重新启动它而不会丢失数据。问题是,当我运行它时,它会引发权限错误:

db_1  | 2015-12-23 19:17:59 7facaa89b740  InnoDB: Operating system error number 13 in a file operation.
db_1  | InnoDB: The error means mysqld does not have the access rights to
db_1  | InnoDB: the directory.

我已经尝试了我能想到的所有排列以使其正常工作。我正在阅读,它可能与 docker-machine 如何处理 OSX 的权限有关,但 docker-machine 的文档说它安装了 /Users 文件夹,所以这应该不是问题。

这是docker-compose.yml

web:
  build: .
  ports:
    - "3000:3000"
  links:
    - db
db:
  image: mysql:5.6
  ports:
    - "3306:3306"
  volumes:
    - /Users/me/Development/mysql-data:/var/lib/mysql
  environment:
    MYSQL_ROOT_PASSWORD: mypass

有什么想法吗?我不禁认为这很简单。任何帮助将不胜感激!

编辑:

  • 主机 - drwxr-xr-x 7 me staff 238 Dec 23 12:10 mysql-data/
  • 虚拟机-drwxr-xr-x 1 docker staff 238 Dec 23 20:10 mysql-data/

对于容器,它不会在安装卷的情况下运行。没有-v 挂载,它是:

  • 容器 - drwxr-xr-x 4 mysql mysql 4096 Dec 24 00:37 mysql

【问题讨论】:

  • 三个位置(主机、虚拟机、容器)中数据目录的ls -lh 输出将有助于调试。我认为最有可能发生的事情是该目录由 root 拥有,并且不允许 mysql 用户创建新文件。
  • @dnephin,我已经用数据更新了上面的问题。这有帮助吗?

标签: mysql docker docker-compose docker-machine


【解决方案1】:

这来自于 Mac 和 Linux 分别使用的用户 ID。 Mac 不喜欢 Linux 想要使用 1 作为用户 ID。

我在 mac + docker-machine 设置中解决所有权限问题的方法是使用这个 Dockerfile

FROM mysql:5.6

RUN usermod -u 1000 mysql
RUN mkdir -p /var/run/mysqld
RUN chmod -R 777 /var/run/mysqld

而不是普通的 MySQL 5.6 Image。

最后两行是必需的,因为更改 mysql 用户的用户 ID 会弄乱该图像的构建权限。 => 你需要 777 权限才能让它在这里运行:/

我知道这有点 hacky,但到目前为止我所知道的权限问题的最佳解决方案。

【讨论】:

  • 好的,这帮了大忙!图像至少保持不变。不过,我没有在套接字上运行它。但是,如果没有最后两行,我会得到:[ERROR] Can't start server : Bind on unix socket: Permission denied[ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ? 然后它就可以了。有什么想法吗?
  • 哦,对不起,我的错。我在这里混合了一些东西。如果您切换用户 ID,这将与构建到基础映像中的权限混淆。用户 ID 1000 将无法访问 /var/run/mysqld => 您需要手动调整。
  • 感谢您的来信。尝试从链接的容器连接说ERROR 1130 (HY000): Host '172.17.0.3' is not allowed to connect to this MySQL server,所以我想也许我也必须在其中添加自己的my.cnf
  • @alariva 你能提供你的情况下 mysqld 的日志吗?我相信我们可以从那里弄清楚。您可以在命令末尾添加类似|| cat /var/log/mysql* 的内容来启动mysql。 (抱歉这里不知道日志路径,但应该和上面差不多)
  • @alariva 啊现在我明白了,很抱歉错过了显而易见的事情。您不能从RUN 部分内运行/etc/init.d/mysql start(或者在使用debian 主映像时通常在映像构建期间)!查看stackoverflow.com/questions/26938684/… 和那里的第一个答案以获取更多详细信息。抱歉,但你需要以某种方式重新组织你的构建:(
【解决方案2】:

尝试使用最新的 docker for mac 代替 docker 工具。 Docker for Mac 不再使用 VirtualBox,而是使用 HyperKit,这是一个轻量级的 OS X 虚拟化解决方案,构建在 OS X 10.10 Yosemite 及更高版本的 Hypervisor.framework 之上。

我建议也完全删除 docker 工具(它们可以共存):https://github.com/docker/toolbox/blob/master/osx/uninstall.sh

使用 docker for mac,您不必使用权限黑客,它就像在 linux 构建上一样工作。

【讨论】:

  • 您能否提供一个装载可写卷的 Dockerfile 或 compose 文件的具体示例?
猜你喜欢
  • 2023-03-19
  • 2019-06-05
  • 1970-01-01
  • 2020-10-23
  • 2019-02-13
  • 2019-11-13
  • 1970-01-01
  • 2021-01-09
  • 2021-03-28
相关资源
最近更新 更多