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

Tay*_*r H 9 mysql database save docker

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

这是我用来构建初始映像的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"]
Run Code Online (Sandbox Code Playgroud)

建立之后,我进入图像:

docker run -i -t myorg/mysql:base bash
Run Code Online (Sandbox Code Playgroud)

并运行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
Run Code Online (Sandbox Code Playgroud)

我可以进入mysql并验证架构是否已成功导入:

 mysql -u root -D mydb -e "SELECT * from tokens;"
Run Code Online (Sandbox Code Playgroud)

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

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

docker commit -m="import schema.sql" -a="Me" 72c2ff39dd65 myorg/mysql:seed
Run Code Online (Sandbox Code Playgroud)

然后进入新的形象:

docker run -i -t --rm myorg/mysql:seed bash
Run Code Online (Sandbox Code Playgroud)

该数据库文件是不再在/ var/lib中/ MySQL和运行mysql -u root -e "SHOW DATABASES"不显示的mydb数据库,只有默认mysql,information_schemaperformance_schemaDBS.我发现如果我在container(echo 'test' > newfile)中创建了一个新的文本文件,那么该文件将出现在已提交的映像中,而不是数据库中.

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

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

use*_*103 2

你最好还是使用自己的 mysql。这样就不会有任何惊喜,也没有隐藏的“魔法”。

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

有关 docker 卷的文档。

数据量

数据卷是一个或多个容器中专门指定的目录,它绕过联合文件系统,为持久或共享数据提供多种有用的功能:

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

  • 加 1 用于识别问题,但减 1 用于“自行解决”。您不需要重复已经完成的工作。 (4认同)