docker容器中的mysql无法在os x

时间:2015-05-28 15:52:39

标签: docker boot2docker

在OS X上。

我试图通过boot2docker在docker容器中运行mysql,在主机上挂载卷/var/lib/mysql,这样我就可以拥有持久的mysql数据。 我计划将来使用仅数据容器,但现在我正在尝试使用此选项。

我使用以下命令来运行容器:

docker run -v /Users/yash/summers/db:/var/lib/mysql -i -t 'image name'

/Users/yash/summers/db文件夹已存在。

我正面临着这方面的问题。使用命令行,我可以访问目录,创建/删除新文件,但是当我运行时 service mysql start,我收到以下错误:

150528 15:43:43 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
150528 15:43:43 [Warning] Using unique option prefix key_buffer instead of key_buffer_size is deprecated and will be removed in a future release. Please use the full name instead.
150528 15:43:43 [Note] /usr/sbin/mysqld (mysqld 5.5.43-0ubuntu0.14.04.1) starting as process 909 ... 
150528 15:43:43 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
150528 15:43:43 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.150528 15:43:43 [Note] Plugin 'FEDERATED' is disabled.
/usr/sbin/mysqld: Table 'mysql.plugin' doesn't exist
150528 15:43:43 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
150528 15:43:43 InnoDB: The InnoDB memory heap is disabled
150528 15:43:43 InnoDB: Mutexes and rw_locks use GCC atomic builtins
150528 15:43:43 InnoDB: Compressed tables use zlib 1.2.8 
150528 15:43:43 InnoDB: Using Linux native AIO
150528 15:43:43 InnoDB: Initializing buffer pool, size = 128.0M
150528 15:43:43 InnoDB: Completed initialization of buffer pool
150528 15:43:43  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'create'.
InnoDB: Cannot continue operation.
150528 15:43:44 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 

过去两天我试图解决此问题,经历了thisthisthis这么多页面。

我无法解决我的问题。我想我无法完美地做出解决方案的建议。

根据我的理解,这些页面上列出了一些解决方法,包括更改uid和guid,但我认为它们没有得到很好的解释。

任何人都可以向我解释一下详细的解决方法。

更新1:我尝试使用仅限数据的容器,但仍面临同样的问题。

如果我不使用任何-v--volumes-from选项,我可以运行一切正常,所以我认为mysql服务器没有问题。

更新2: 用于创建仅数据容器的Dockerfile:

FROM ubuntu

RUN mkdir /var/lib/mysql

VOLUME /var/lib/mysql

3 个答案:

答案 0 :(得分:3)

有两种不同的解决方案。

  1. 解决方案#1。使用Dockerfile

    (我不喜欢它,因为我更喜欢Docker Hub中的官方图片而没有任何更改)

    RUN usermod -u 1000 mysql添加到Docker文件以设置ID 1000 对于用户" mysql" (与docker-machine内部相同的ID)。

  2. 解决方案#2。使用my.cnf

    我仍在使用自己的配置我更喜欢这个解决方案。我们alredy拥有ID为1000的root用户,因为我们 可以使用此用户运行MySQL:

    • <强>的my.cnf

      主行为user = root (您可以使用sed仅更改文件中的此行。我更喜欢挂载所有文件)

      [client]
      port        = 3306
      socket      = /var/run/mysqld/mysqld.sock
      default-character-set = utf8
      
      [mysqld_safe]
      pid-file    = /var/run/mysqld/mysqld.pid
      socket      = /var/run/mysqld/mysqld.sock
      nice        = 0
      
      [mysqld]
      user        = root
      pid-file    = /var/run/mysqld/mysqld.pid
      socket      = /var/run/mysqld/mysqld.sock
      port        = 3306
      basedir     = /usr
      datadir     = /var/lib/mysql
      tmpdir      = /tmp
      lc-messages-dir = /usr/share/mysql
      explicit_defaults_for_timestamp
      init_connect='SET collation_connection = utf8_unicode_ci'
      init_connect='SET NAMES utf8'
      character-set-server=utf8
      collation-server=utf8_unicode_ci
      skip-character-set-client-handshake
      
      # Instead of skip-networking the default is now to listen only on
      # localhost which is more compatible and is not less secure.
      #bind-address   = 127.0.0.1
      
      #log-error  = /var/log/mysql/error.log
      
      # Recommended in standard MySQL setup
      sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
      
      # Disabling symbolic-links is recommended to prevent assorted security risks
      symbolic-links=0
      
      # * IMPORTANT: Additional settings that can override those from this file!
      #   The files must end with '.cnf', otherwise they'll be ignored.
      #
      !includedir /etc/mysql/conf.d/
      
    • 使用此文件更改默认my.cnf:

      docker run -it -v ./mysql/var/lib/mysql:/var/lib/mysql -v ./my.cnf::/etc/mysql/my.cnf mariadb:10.0.22

答案 1 :(得分:0)

当您使用docker run -v选项时,docker不会使用文件所有权进行操作。因此,容器内挂载文件夹的所有者将具有与主机系统中相同的UID(用户名可以不同)。 您可以通过chmod命令更改容器内文件或目录的所有权,但它也会更改主机系统中的所有权。 因此,在运行docker容器之前,您可以在主机系统上准备正确的所有权。 此示例演示了它的工作原理(在您的系统上尝试):

我有〜/ foo目录,由我拥有 - 我的UID是1000

~ $ ls -lnd foo
drwxr-xr-x 2 1001 1000 4096 Nov 24 22:47 foo

运行docker容器,将〜/ foo目录挂载到它们并显示容器内的所有权

~ $ docker run -it --rm -v ~/foo:/tmp/foo busybox ls -ln /tmp
total 4
drwxr-xr-x    2 1000     1000          4096 Nov 24 21:47 foo

容器内的所有者UID是相同的。 现在我更改了计算机上的目录所有权。

~ $ sudo chown 1001 foo

再次启动容器,安装foo目录并显示所有权

~ $ docker run -it --rm -v ~/foo:/tmp/foo busybox ls -ln /tmp
total 4
drwxr-xr-x    2 1001     1000          4096 Nov 24 21:47 foo

所有者UID也被更改了

但有一个例外。如果您尝试将卷挂载到不存在的目录,则docker将自动创建此缺少的目录(但这是不推荐使用的功能,因此不要这样做)并且此目录将使用UID 0创建。 试试吧:

~ $ docker run -it --rm -v ~/foo:/tmp/bar/foo busybox ls -ln /tmp
total 4
drwxr-xr-x    3 0        0             4096 Nov 24 22:10 bar

答案 2 :(得分:-1)

我同样遇到了这个问题;我通过chmod / chown'ing在我的数据容器中解决了它,例如:

FROM ubuntu

# Create data directory
RUN mkdir -p /data /var/lib/mysql
RUN chmod -R 777 /data /var/lib/mysql
RUN chown -R root:root /data /var/lib/mysql

# Create /data volume
VOLUME /data
VOLUME /var/lib/mysql

我相信这是有效的,因为UFS现在可以正确记录权限,而不是依赖于直接从主机挂载来执行此操作,正如您所发现的那样,它不适用于OS X