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

时间:2014-12-19 19:10:57

标签: mysql database save docker

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

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

FROM dockerfile/mysql:latest
MAINTAINER (me)

ADD schema.sql /data/schema.sql

EXPOSE 3306

# Define working directory.
WORKDIR /data

CMD ["mysqld_safe"]

建立之后,我进入图像:

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并验证架构是否已成功导入:

 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_schema,和performance_schema dbs。我发现如果我在容器(echo 'test' > newfile)中创建了一个新的文本文件,那么该文件将出现在已提交的映像中,而不是数据库中。

我想知道这是否与可信图像Dockerfile具有VOLUME ["/etc/mysql", "/var/lib/mysql"]这一事实有关,因此它将db目录作为卷安装。我的Dockerfile没有这个命令,但我不知道它是否继承了(我真的不明白卷如何运行得足以知道这可能会如何影响我的构建)。我不需要将db作为卷安装,因为我需要另一个容器通过网络连接连接到它(我将使用docker链接)。

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

2 个答案:

答案 0 :(得分:4)

作为另一个答案,您已声明无法提交卷,子容器实际上会从父级继承卷定义。因此,对卷的任何更改都将被丢弃。我想添加诸如mysql数据库文件之类的数据应该总是在卷中,原因有几个,你不应该尝试将它提交到你的图像中。

  1. 如果必须迁移容器,如果容器中的数据不在卷中,则没有简单的方法从容器中提取数据。
  2. 如果要启动多个共享数据的容器,则必须在卷中包含数据。
  3. 如果要使用新卷或端口更改容器定义,则必须删除并重新创建容器定义。如果容器中有数据,则会将其丢失。 (有关此案例的说明,请参阅this question。)
  4. 联合文件系统比普通文件系统慢,这会降低应用程序或数据库的速度。
  5. 那你该怎么做呢?

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

答案 1 :(得分:2)

你可能最好滚动你自己的mysql。这样就没有惊喜,没有隐藏的“魔法”。

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

Docs on docker volumes.

数据量

数据卷是一个或多个容器中的一个特别指定的目录,它绕过Union文件系统为持久性或共享数据提供了一些有用的功能:

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