首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OS X上的mariadb docker容器:无法创建数据库目录

OS X上的mariadb docker容器:无法创建数据库目录
EN

Stack Overflow用户
提问于 2016-05-21 07:33:55
回答 3查看 3.9K关注 0票数 1

我在OSX上的mariadb遇到了麻烦,我在CentOS上也做了同样的事情,它工作得很好。所以一定是OSX的问题:

代码语言:javascript
复制
mariadb:
  image: mariadb:latest
  container_name: mariadb
  ports:
    - "3306:3306"
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: XXXXXXXX
  volumes:
    - /Users/sandro/Code/mysql:/var/lib/mysql

日志包含以下错误:

代码语言:javascript
复制
mkdir: cannot create directory '/var/lib/mysql//mysql': Permission denied
Fatal error Can't create database directory '/var/lib/mysql//mysql'

如果我让它像这样安装在容器中:

代码语言:javascript
复制
volumes:
        - /var/lib/mysql

它可以工作,但我有持久性的问题,一旦vm重启数据库就消失了。

我试图创建mysql目录并赋予它全局可写权限,但却收到了以下错误:

代码语言:javascript
复制
2016-05-20 23:43:54 140694234605504 [Note] mysqld (mysqld 10.1.14-MariaDB-1~jessie) starting as process 1 ...
2016-05-20 23:43:54 140694234605504 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
2016-05-20 23:43:54 140694234605504 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2016-05-20 23:43:54 140694234605504 [Note] InnoDB: The InnoDB memory heap is disabled
2016-05-20 23:43:54 140694234605504 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2016-05-20 23:43:54 140694234605504 [Note] InnoDB: Memory barrier is not used
2016-05-20 23:43:54 140694234605504 [Note] InnoDB: Compressed tables use zlib 1.2.8
2016-05-20 23:43:54 140694234605504 [Note] InnoDB: Using Linux native AIO
2016-05-20 23:43:54 140694234605504 [Note] InnoDB: Using SSE crc32 instructions
2016-05-20 23:43:54 140694234605504 [Note] InnoDB: Initializing buffer pool, size = 256.0M
2016-05-20 23:43:54 140694234605504 [Note] InnoDB: Completed initialization of buffer pool
2016-05-20 23:43:54 140694234605504 [ERROR] InnoDB: ./ibdata1 can't be opened in read-write mode
2016-05-20 23:43:54 140694234605504 [ERROR] InnoDB: The system tablespace must be writable!
2016-05-20 23:43:54 140694234605504 [ERROR] Plugin 'InnoDB' init function returned error.
2016-05-20 23:43:54 140694234605504 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2016-05-20 23:43:54 140694234605504 [ERROR] mysqld: File '/var/lib/mysql/aria_log_control' not found (Errcode: 13 "Permission denied")
2016-05-20 23:43:54 140694234605504 [ERROR] mysqld: Got error 'Can't open file' when trying to use aria control file '/var/lib/mysql/aria_log_control'
2016-05-20 23:43:54 140694234605504 [ERROR] Plugin 'Aria' init function returned error.
2016-05-20 23:43:54 140694234605504 [ERROR] Plugin 'Aria' registration as a STORAGE ENGINE failed.
2016-05-20 23:43:54 140694234605504 [Note] Plugin 'FEEDBACK' is disabled.
2016-05-20 23:43:54 140694234605504 [ERROR] Could not open mysql.plugin table. Some plugins may be not loaded
2016-05-20 23:43:54 140694234605504 [ERROR] Unknown/unsupported storage engine: InnoDB
2016-05-20 23:43:54 140694234605504 [ERROR] Aborting
EN

回答 3

Stack Overflow用户

发布于 2016-07-26 09:53:35

使mysql容器作为用户1000运行。

在Dockerfile中:

代码语言:javascript
复制
USER "1000"

在docker-compose.yml中

代码语言:javascript
复制
db:
   image: mysql
   user: "1000"

这是我目前的变通方法(通过docker-compose.yml完成)。1000用户是-I believe- docker卷(至少对于docker-machine)中文件的默认用户,因此这应该允许您写入卷。

票数 3
EN

Stack Overflow用户

发布于 2016-05-21 07:39:13

很可能是权限问题。在Mac上,docker在通过VM映射本地目录的虚拟机器中运行。要获得正确的权限是很棘手的。首先尝试在/Users/sandro/Code目录上设置限制最少的权限。另外,在启动容器之前,尝试预先创建/Users/sandro/Code/myssql目录,并赋予其全局可写权限。

更新:所以问题实际上更加复杂。看起来你不能做很多低级的文件调用,除非容器内的用户id与启动docker机器的用户的id匹配。以下是澄清此问题的一些链接:

https://www.bountysource.com/issues/5393565-1-3-0-only-root-can-write-to-osx-volumes-can-t-change-permissions-within

https://github.com/boot2docker/boot2docker/issues/581

该问题存在于boot2docker、MariaDB镜像启动脚本、docker-compose和Virtual Box来宾操作系统之间

通过这样做,我能够运行maria db容器。

代码语言:javascript
复制
mkdir mysql
chmod ug+ws mysql
docker run -it -u $UID:$UID -e MYSQL_ROOT_PASSWORD=bob \
         -v /Users/vlad/Proj/Stack/maria/mysql:/var/lib/mysql \
         mariadb:latest

请注意,-u选项

票数 1
EN

Stack Overflow用户

发布于 2017-10-06 16:51:05

路径在错误消息中看起来很奇怪:mkdir: cannot create directory '/var/lib/mysql//mysql': Permission denied

对我来说,mariadb镜像看起来像是在卷路径上附加了/mysql。通过在docker-compose.yml文件中删除/mysql,它就像一个护身符一样工作。

代码语言:javascript
复制
mdb:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: password
  volumes:
    - ./data:/var/lib
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37357315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档