Docker mysql 容器无法使用启动时定义的数据卷
Docker mysql container cannot use a data volume defined on startup
我在尝试 运行 一个 mysql 带有数据卷的容器安装在主机上时遇到了问题。
这是一个docker文件:
from ubuntu:14.04
maintainer Tiago Pires, tandrepires@gmail.com
# Because docker replaces /sbin/init: https://github.com/dotcloud/docker/issues/1024
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN echo "deb http://archive.ubuntu.com/ubuntu trusty main universe" > /etc/apt/sources.list
RUN apt-get update && apt-get upgrade -y
ADD create_database.sql /tmp/create_database.sql
RUN apt-get install -y mysql-server
RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
RUN /usr/bin/mysqld_safe & \
sleep 10s && \
mysql -u root < /tmp/create_database.sql
VOLUME ["/var/lib/mysql", "/var/log/mysql"]
CMD ["mysqld_safe"]
我构建并 运行 成功。
容器在 docker 主目录中创建了一个卷,所有必需的 mysql 数据都存在。
ls -l /var/lib/docker/vfs/dir/262aa2622c54f3a5d28ea9c1b90e6f67c93309f73921c724354a0e0155af2f0f
total 28684
-rw-r--r-- 1 root root 0 Jun 1 14:12 debian-5.5.flag
-rw-rw---- 1 messagebus messagebus 18874368 Jun 1 14:12 ibdata1
-rw-rw---- 1 messagebus messagebus 5242880 Sep 23 18:44 ib_logfile0
-rw-rw---- 1 messagebus messagebus 5242880 Jun 1 14:12 ib_logfile1
drwx------ 2 messagebus root 4096 Jun 1 14:12 mysql
drwx------ 2 messagebus messagebus 4096 Jun 1 14:12 performance_schema
drwx------ 2 messagebus messagebus 4096 Jun 1 14:12 sonar
现在想明确定义一个文件夹挂载数据卷
docker run -d -p 3306:3306 \
-v $HOME/data:/var/lib/mysql \
-v $HOME/log:/var/log/mysql \
--name=sonar-sql sonar-sql
但是这次我有一个错误:
150924 7:59:07 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.
我看到数据文件夹已经创建。我尝试再次更改权限和 运行 еру 容器:
chmod a+wrX data
这次又报错了:
150924 8:02:20 InnoDB: Completed initialization of buffer pool
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
150924 8:02:20 InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
150924 8:02:20 InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
150924 8:02:21 InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: 127 rollback segment(s) active.
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
150924 8:02:21 InnoDB: Waiting for the background threads to start
150924 8:02:22 InnoDB: 5.5.35 started; log sequence number 0
150924 8:02:22 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
150924 8:02:22 [Note] - '0.0.0.0' resolves to '0.0.0.0';
150924 8:02:22 [Note] Server socket created on IP: '0.0.0.0'.
150924 8:02:22 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
150924 08:02:22 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
现在data文件夹的内容如下(部分必要文件不存在):
ls -l
-rw-rw---- 1 messagebus messagebus 18874368 Sep 24 11:02 ibdata1
-rw-rw---- 1 messagebus messagebus 5242880 Sep 24 11:02 ib_logfile0
-rw-rw---- 1 messagebus messagebus 5242880 Sep 24 11:02 ib_logfile1
Mysql 进程是 运行 来自容器内的 mysql 用户,该用户在主机上不存在。
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.4 0.0 4440 776 ? Ss 08:07 0:00 /bin/sh /usr/bin/mysqld_safe
mysql 352 1.0 0.7 492520 55636 ? Sl 08:07 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mys
root 370 1.0 0.0 18136 1860 ? Ss 08:08 0:00 bash
root 385 0.0 0.0 15564 1140 ? R+ 08:08 0:00 ps aux
问:Docker 文档说,VOLUME 命令和 -v 选项应该做同样的事情,请解释为什么我对 VOLUME 没问题,但用“-v”失败了".
Ubuntu 14.04.2 LTS
Docker 版本 1.6.0,内部版本 4749651
正在回答您的问题。
-v
选项有两种风格。 One 确实与 VOLUME
指令相同,看起来像 -v /var/lib/mysql -v /var/log/mysql
。它为容器定义了一个体积。
您在示例中使用的形式不同,因为它将主机目录挂载到容器的 FS。参见 https://docs.docker.com/userguide/dockervolumes/#mount-a-host-directory-as-a-data-volume。
我在尝试 运行 一个 mysql 带有数据卷的容器安装在主机上时遇到了问题。
这是一个docker文件:
from ubuntu:14.04
maintainer Tiago Pires, tandrepires@gmail.com
# Because docker replaces /sbin/init: https://github.com/dotcloud/docker/issues/1024
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN echo "deb http://archive.ubuntu.com/ubuntu trusty main universe" > /etc/apt/sources.list
RUN apt-get update && apt-get upgrade -y
ADD create_database.sql /tmp/create_database.sql
RUN apt-get install -y mysql-server
RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
RUN /usr/bin/mysqld_safe & \
sleep 10s && \
mysql -u root < /tmp/create_database.sql
VOLUME ["/var/lib/mysql", "/var/log/mysql"]
CMD ["mysqld_safe"]
我构建并 运行 成功。 容器在 docker 主目录中创建了一个卷,所有必需的 mysql 数据都存在。
ls -l /var/lib/docker/vfs/dir/262aa2622c54f3a5d28ea9c1b90e6f67c93309f73921c724354a0e0155af2f0f
total 28684
-rw-r--r-- 1 root root 0 Jun 1 14:12 debian-5.5.flag
-rw-rw---- 1 messagebus messagebus 18874368 Jun 1 14:12 ibdata1
-rw-rw---- 1 messagebus messagebus 5242880 Sep 23 18:44 ib_logfile0
-rw-rw---- 1 messagebus messagebus 5242880 Jun 1 14:12 ib_logfile1
drwx------ 2 messagebus root 4096 Jun 1 14:12 mysql
drwx------ 2 messagebus messagebus 4096 Jun 1 14:12 performance_schema
drwx------ 2 messagebus messagebus 4096 Jun 1 14:12 sonar
现在想明确定义一个文件夹挂载数据卷
docker run -d -p 3306:3306 \
-v $HOME/data:/var/lib/mysql \
-v $HOME/log:/var/log/mysql \
--name=sonar-sql sonar-sql
但是这次我有一个错误:
150924 7:59:07 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.
我看到数据文件夹已经创建。我尝试再次更改权限和 运行 еру 容器:
chmod a+wrX data
这次又报错了:
150924 8:02:20 InnoDB: Completed initialization of buffer pool
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
150924 8:02:20 InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
150924 8:02:20 InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
150924 8:02:21 InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: 127 rollback segment(s) active.
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
150924 8:02:21 InnoDB: Waiting for the background threads to start
150924 8:02:22 InnoDB: 5.5.35 started; log sequence number 0
150924 8:02:22 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
150924 8:02:22 [Note] - '0.0.0.0' resolves to '0.0.0.0';
150924 8:02:22 [Note] Server socket created on IP: '0.0.0.0'.
150924 8:02:22 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
150924 08:02:22 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
现在data文件夹的内容如下(部分必要文件不存在):
ls -l
-rw-rw---- 1 messagebus messagebus 18874368 Sep 24 11:02 ibdata1
-rw-rw---- 1 messagebus messagebus 5242880 Sep 24 11:02 ib_logfile0
-rw-rw---- 1 messagebus messagebus 5242880 Sep 24 11:02 ib_logfile1
Mysql 进程是 运行 来自容器内的 mysql 用户,该用户在主机上不存在。
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.4 0.0 4440 776 ? Ss 08:07 0:00 /bin/sh /usr/bin/mysqld_safe
mysql 352 1.0 0.7 492520 55636 ? Sl 08:07 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mys
root 370 1.0 0.0 18136 1860 ? Ss 08:08 0:00 bash
root 385 0.0 0.0 15564 1140 ? R+ 08:08 0:00 ps aux
问:Docker 文档说,VOLUME 命令和 -v 选项应该做同样的事情,请解释为什么我对 VOLUME 没问题,但用“-v”失败了".
Ubuntu 14.04.2 LTS Docker 版本 1.6.0,内部版本 4749651
正在回答您的问题。
-v
选项有两种风格。 One 确实与 VOLUME
指令相同,看起来像 -v /var/lib/mysql -v /var/log/mysql
。它为容器定义了一个体积。
您在示例中使用的形式不同,因为它将主机目录挂载到容器的 FS。参见 https://docs.docker.com/userguide/dockervolumes/#mount-a-host-directory-as-a-data-volume。