Docker mysql container cannot use a data volume defined on startup

I have encountered an issue while trying to run a mysql container with a data volume mounted on a host.

Here is a dockerfile:

from ubuntu:14.04
maintainer Tiago Pires, [email protected]

# 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"]

I build and run it successfully. The container has created a volume in the docker home directory, all necessary mysql data is present.

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

Now I want to explicitly define a folder to mount a data volume.

docker run -d -p 3306:3306 \
        -v $HOME/data:/var/lib/mysql \
        -v $HOME/log:/var/log/mysql \
        --name=sonar-sql sonar-sql

But this time I have an error:

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.

I see that the data folder has been created. I try to change privileges and run еру container again:

chmod a+wrX data

This time I have another error:

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

Content of the data folder now is the following (some necessary files do not exist):

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 process is run from mysql user inside the container, this user does not exist on host.

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

Q: Docker documentation says, that VOLUME command and -v option are supposed to do the same, please explain me why I am OK with VOLUME, but failing with "-v".

Ubuntu 14.04.2 LTS Docker version 1.6.0, build 4749651

Upvotes: 1

Views: 5030

Answers (1)

Mykola Gurov
Mykola Gurov

Reputation: 8695

Answering your Q.

There are two flavors of the -v option. One is indeed same as the VOLUME instruction and looks like -v /var/lib/mysql -v /var/log/mysql. It defines a volume for the container.

The form you used in your example is different as it mounts a host directory to the container's FS. See https://docs.docker.com/userguide/dockervolumes/#mount-a-host-directory-as-a-data-volume .

Upvotes: 1

Related Questions