【问题标题】:Creating, populating, and using Docker Volumes创建、填充和使用 Docker 卷
【发布时间】:2019-07-28 18:25:38
【问题描述】:

过去几天我一直在使用 Docker,希望尽快将我的 Python-MySQL webapp 迁移到 Docker。

推论是我需要使用 Docker 卷并且最近被难住了。我可以直接通过

创建一个卷

$ docker volume create my-vol

或间接通过在 docker run 调用中引用不存在的卷,但我无法弄清楚如何使用我的 .sql 数据库文件填充这些卷,而不通过 Dockerfile 中的 COPY 调用复制文件。

我尝试直接在包含 .sql 文件的目录中创建卷(上面提到的第一种方法)并在我的“docker run”调用中安装包含 .sql 文件的目录,这确实将 .sql 文件移动到容器(我通过导航容器内的 bash shell 看到它)但是当运行连接到包含数据库的 mariadb 容器的 mariadb 容器时(如 mariadb docker 自述文件中所建议的那样),它只有标准数据库(information_schema , mysql, performance_schema)

如何创建包含我预先存在的 .sql 数据库的卷?

【问题讨论】:

  • 为什么不绑定主机路径-v /var/lib/mysql/data.sql:/somewhere/data.sql?
  • @HernanGarcia 这是否意味着对数据库的任何更改都会传递到本地版本?我尝试了这个,我可以将 .sql 文件放入容器的 mariadb 的唯一方法是使用 mysql -u root -p NHL_Database < data.sql 导入。然后,我检查了作为挂载的本地目录,它的“修改”时间签名没有改变。

标签: mysql docker mariadb docker-volume


【解决方案1】:

在 docker 容器中使用 mariadb 时,映像支持在容器首次启动时运行 .sql 文件。这允许您在数据可供访问之前将其推送到数据库中。

来自the mariadb documentation:

初始化一个新实例

第一次启动容器时,将创建一个具有指定名称的新数据库,并 使用提供的配置变量进行初始化。此外,它 将执行扩展名为 .sh、.sql 和 .sql.gz 的文件 在/docker-entrypoint-initdb.d 中找到。文件将在 按字母顺序。您可以通过以下方式轻松填充 mariadb 服务 将 SQL 转储挂载到该目录并提供自定义图像 贡献的数据。 SQL 文件将默认导入到 MYSQL_DATABASE 变量指定的数据库。

这意味着如果要在容器第一次启动时将数据注入容器。在您的Dockerfile、COPY 中将.sql 文件放入路径/docker-entrypoint-initdb.d/myscript.sql 的容器中 - 它将在您在环境变量MYSQL_DATABASE 中指定的数据库上调用。

像这样:

FROM mariadb
COPY ./myscript.sql /docker-entrypoint-initdb.d/myscript.sql

然后:

docker run -e MYSQL_DATABASE=mydb mariadb

然后是您希望如何管理数据库存储的问题。您在这里基本上有两个选择:

  1. 创建一个卷绑定到主机,mariadb 存储数据库。这将使您能够轻松地从主机访问数据库存储文件。

docker 运行示例:

docker run -v /my/own/datadir:/var/lib/mysql mariadb
  1. 创建一个 docker 卷并将其绑定到容器中的存储位置。这将是一个由 docker 管理的卷。此卷将在容器重新启动之间保留数据。
docker volume create my_mariadb_volume
docker run -v my_mariadb_volume:/var/lib/mysql mariadb

docs for the mariadb docker 镜像中也包含了它。如果您要使用这张图片,我建议您从上到下阅读。

【讨论】:

  • 这个答案是绝对的。它留给我做的只是在调用“docker run -p 3306:3306”时公开端口,我必须实际填充数据库(它已创建但为空。这是由于在实例化图像后安装卷, 使用上面的选项 2)
猜你喜欢
  • 2019-06-03
  • 2022-06-15
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多