在OSX中挂载Docker卷时出现权限被拒绝的错误

11

我对这个问题束手无策,希望你们能帮助我。在使用docker-machine的OSX 10.11.2中,我有一个docker-compose文件,应该构建一个本地Dockerfile并连接一个MySQL容器。MySQL容器应该挂载一个本地文件夹,其中我存储了我的数据库数据,因此,如果容器或虚拟机关闭,我可以重新启动它而不会丢失数据。问题是,当我运行它时,它会抛出一个权限错误:

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
@dnephin,我已经更新了上面的问题并提供了数据。这有帮助吗? - greggilbert
2个回答

14

这个问题源自于Mac和Linux使用的用户ID不同。对于用户ID为1,Mac不允许Linux进行使用。

我在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 镜像。

最后两行是必要的,因为更改 mysql 用户的 userid 将破坏该镜像内置权限。 => 您需要 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 ?那么有什么建议吗? - greggilbert
感谢您的留言。尝试从链接的容器连接时出现“ERROR 1130(HY000):主机'172.17.0.3'不允许连接到此MySQL服务器”的错误,因此我认为也许我需要在那里添加自己的'my.cnf'? - greggilbert
很可能不是这个问题。你是从一个干净的数据库开始还是已经有用户了? 很可能那个东西中的初始用户是以禁止远程访问的方式创建的。在浪费时间在my.cnf上之前,我建议尝试使用空数据目录重新运行以排除这种可能性。 - Armin Braun
1
@alariva,你能提供一下你的情况下mysqld的日志吗?我相信我们可以从中找到解决方法。你只需要在启动mysql的命令末尾添加类似于|| cat /var/log/mysql*的内容即可。(抱歉,我不记得日志路径了,但应该接近上面的路径) - Armin Braun
1
@alariva 现在我明白了,很抱歉错过了这个显而易见的问题。 你不能在 RUN 部分(或者使用 debian 主镜像时,在镜像构建期间)运行 /etc/init.d/mysql start! 请查看 https://dev59.com/2F8d5IYBdhLWcg3wVQ-9 并查看那里的第一个答案以获取更多详细信息。很抱歉,但你需要重新组织你的构建方式 :( - Armin Braun
显示剩余7条评论

2
请尝试使用最新的Docker for Mac,而不是Docker工具。 Docker for Mac不再使用VirtualBox,而是HyperKit,一个建立在OS X 10.10 Yosemite及更高版本中Hypervisor.framework之上的轻量级OS X虚拟化解决方案。
我建议彻底删除docker工具(它们可以共存):https://github.com/docker/toolbox/blob/master/osx/uninstall.sh 使用Docker for Mac时,您无需使用权限黑客技术,它将像在Linux构建中一样运行。

你能提供一个具体的Dockerfile或compose文件的例子,它挂载了一个可写卷吗? - Ted Stresen-Reuter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接