我是 Docker 世界的新手,我正在努力实现一些人们认为微不足道的事情。然而,似乎很多初学者在使用 Docker 时很难持久化他们的数据。
我使用Dockerfile构建了一个自定义图像。该容器运行MySQL 服务器,并且...是的,您猜对了:我想保留数据。
这是我的 Dockerfile:
FROM debian:8.7
ENV MYSQL_ROOT_PASSWORD=test
RUN apt-get update -y && apt-get install -y apt-utils && \
echo "mysql-server mysql-server/root_password password $MYSQL_ROOT_PASSWORD" | debconf-set-selections && \
echo "mysql-server mysql-server/root_password_again password $MYSQL_ROOT_PASSWORD" | debconf-set-selections && \
apt-get install -y mysql-server mysql-client && service mysql start
CMD service mysql start && /bin/bash
VOLUME /var/lib/mysql
EXPOSE 3306
我以这种方式构建和运行图像:
docker build -t mysql-persist-test:0.1 .
docker run -dt -v database_volume:/var/lib/mysql mysql-persist-test:0.1
到目前为止,一切都按预期工作,包括数据库。
但是,假设我想在我的主机上检索数据(Windows 10,我通过Docker Toolbox安装了 Docker )。
我使用Kitematic将本地文件夹“绑定”到命名卷(见下文),容器自动重新启动,然后……一切都坏了!目录中的所有文件都被删除。有些是用所有者重新创建的,而不是./var/lib/mysql
staff
mysql
然后我有这些错误/var/log/mysql/error.log
:
...
/usr/sbin/mysqld: Table 'mysql.plugin' doesn't exist
170328 16:03:13 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
170328 16:03:13 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
...
170328 16:03:13 InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percents: 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
InnoDB: Apply batch completed
...
170328 16:03:14 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
我究竟做错了什么?