MySQL Docker容器不会将数据保存到新映像

我正在尝试创build一个预设有特定架构和种子数据的MySQL Docker容器,以便可以将其他容器连接到它作为一个数据库。 我使用受信任的dockerfile / mysql映像作为基础,并且我编写了一个Dockerfile来从该基础创build一个新映像,并将我的schema.sql添加到其中。 在build立图像(mysql:base)之后,我一直试图在新容器中运行bash,然后进入mysql并创build我的数据库,然后导入模式。 然后我退出容器,尝试将容器提交给一个新的Docker镜像。 但是,生成的图像不会保留我对MySQL数据库所做的任何更改。 它确实坚持我在容器中写入的其他文件,但不是数据库。

这里是我用来构build初始图像(myorg / mysql:base)的Dockerfile。

FROM dockerfile/mysql:latest MAINTAINER (me) ADD schema.sql /data/schema.sql EXPOSE 3306 # Define working directory. WORKDIR /data CMD ["mysqld_safe"] 

build立后,我进入形象:

 docker run -i -t myorg/mysql:base bash 

并运行MySQL来导入模式:

 myslqd_safe & 141218 00:15:56 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql mysql -u root mysql> CREATE DATABASE mydb; exit; mysql -u root -D mydb < schema.sql 

我可以进入mysql并validation模式已成功导入:

  mysql -u root -D mydb -e "SELECT * from tokens;" 

另外,如果我进入/var/lib/mysql我可以看到有一个mydb目录包含对应于db的.frm文件。

但是,当我退出并尝试将该容器提交到新映像时:

 docker commit -m="import schema.sql" -a="Me" 72c2ff39dd65 myorg/mysql:seed 

然后进入新的形象:

 docker run -i -t --rm myorg/mysql:seed bash 

db文件不在/ var / lib / mysql中,运行mysql -u root -e "SHOW DATABASES"不显示mydb数据库,只显示默认的mysqlinformation_schemaperformance_schema dbs。 我发现,如果我在容器中创build了一个新的文本文件( echo 'test' > newfile ),该文件将出现在提交的图像,但不是数据库。

我不知道这是否与可信映像Dockerfile具有VOLUME ["/etc/mysql", "/var/lib/mysql"]事实有关,因此它将db目录挂载为一个卷。 我的Dockerfile没有这个命令,但是我不知道它是否被inheritance(我真的不知道卷的工作方式是否足够好,知道这可能会影响我的构build)。 我不需要将数据库挂载为卷,因为我需要另一个容器通过networking连接来连接(我将使用docker链接)。

FWIW,我在OS X 10.9.5上运行boot2docker 1.3.2。

作为另一个答案,你已经指出,卷不能被提交,子容器实际上是inheritance了来自父母的卷定义。 因此,卷的任何更改将被丢弃。 我想添加数据,如MySQL数据库文件应该总是在卷中有几个原因,你不应该试图将其提交到您的图像。

  1. 如果您不得不迁移容器,那么从容器中提取数据(如果数据不在容器中)并不是一个简单的方法。
  2. 如果要启动多个共享数据的容器,则必须在卷中有数据。
  3. 如果你想改变你的容器定义说新的卷或端口,你必须删除并重新创build它。 如果你在容器中有数据,你将会丢失它。 ( 这个问题的例子见这个问题 。)
  4. 联合文件系统比正常的文件系统慢,这会减慢你的应用程序或数据库。

那么你应该怎么做呢?

  1. 使用可以与服务容器的任何实例链接的仅数据容器。 然后,您可以使用volume-from将数据存入服务容器。
  2. 使用主机安装的卷,以便您可以重新启动容器并将相同的位置安装到新的容器中。

你可能更好的滚动自己的MySQL。 那样就没有惊喜,没有隐藏的“魔法”。

如果您查看mysql core的示例dockerfile ,可以看到/ var / lib / mysql的VOLUME声明。

Docker卷上的文档。

数据量

数据卷是绕过联盟文件系统的一个或多个容器内的特定目录,为持久数据或共享数据提供若干有用function:

  • 数据卷可以在容器之间共享和重用
  • 数据量的变化是直接进行的
  • 更新图像时,不会包含对数据量的更改
  • 卷持续存在,直到没有容器使用它们