【问题标题】:How to import a mysql dump file into a Docker mysql container如何将 mysql 转储文件导入 Docker mysql 容器
【发布时间】:2021-04-11 14:35:28
【问题描述】:

提前问候和感谢,我实际上是 docker 和 docker-compose 的新手,到目前为止,我观看了很多视频并阅读了很多文章并尝试了一些东西。

我有一个前端容器和一个后端容器,它们作为 Dockerfile 和 docker-compose 设置单独构建和运行。

(我一直在使用 Dockerfile 构建,然后将容器集成到 docker-compose 以确保我理解正确)

我现在需要我的数据库信息,因为我将使用 docker-compose,据我了解,它应该在具有 react 前端和 django 后端的同一网络下构建。

我有一个正在使用的备份 mysql 转储文件,我认为我需要做的是让一个容器运行 mysql 服务器并提供我的表(就像我在本地工作一样)。我一直无法弄清楚如何将备份导入到我的 docker mysql 容器中。

感谢任何帮助。

到目前为止,我尝试的是在命令行中使用 docker 来概述我在 Dockerfile 中需要的部分,然后如上所述将哪些内容移入 docker-compose:

docker run -d --name root -e MYSQL_ROOT_PASSWORD=root mysql # to create my db container

然后我尝试了一堆命令和命令排列,最近在 CLI 中,这是我最近的一些尝试和错误:

docker exec -i root mysql -uroot -proot --force

ERROR 1046 (3D000) at line 22: No database selected

docker exec -i f803170ce38b sh -c 'exec mysql -uroot -p"root"' /homeImac/Downloads/dump-dev-2020-11-10-22-43-06.dmp

ERROR 1046 (3D000) at line 22: No database selected

docker exec -i f803170ce38b sh -c 'exec mysql -uroot -h 192.168.1.51 -p"root"'

错误 1045 (28000): 用户 'root'@'homeimac' 的访问被拒绝(使用密码:YES)

到目前为止,我已经浏览了网络,但我不确定下一步该去哪里,我的想法是否正确?如果有人有如何导入数据库转储(在 dmp 或 dmp.gz 中)的示例,一旦我开始工作,我实际上会在 docker-compose 文件中执行此操作。

考虑一下,我只需要创建容器并导入,所以我什至可能不需要 Dockerfile。 当我到达那里时,我会过那座桥。这就是我的想法:

db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'app'

等等等等

我学了很多东西超级快,也许太快了。感谢您的任何提示!

【问题讨论】:

  • user docker cp 命令将您的转储从本地复制到正在运行的容器中。然后您可以使用docker exec 将转储导入您的数据库。
  • 它似乎工作,但它不是我所期望的。我从容器内开始:docker cp /Users/homeImac/Downloads/dump-dev-2020-11-10-22-43-06.dmp b12e46379195:/dump-dev-2020-11-10-22-43-06.dmp,然后是exec -i b12e46379195 mysql -uroot -proot rolls < dump-dev-2020-11-10-22-43-06.dmp i。这给了我数据库中所有数据的输出,但我不知道它是否真的被导入并被服务。有没有办法告诉我?我可能有错误的命令,我承认。谢谢

标签: mysql database docker docker-compose dockerfile


【解决方案1】:

docker hub page of MySQL 中给出了您问题的答案。

初始化一个新实例

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

在你的 docker-compose.yml 中使用:

volumes:
  - ${PWD}/config/start.sql:/docker-entrypoint-initdb.d/start.sql

就是这样。

【讨论】:

  • 感谢您提供的信息,我必须承认,我是一名试图在后端工作的前端人员。它可能显示。为了澄清,即使转储是一个开发备份,它是一个包含一堆表甚至更多数据的非常大的数据库,我是否必须创建数据库?是的,在看了更多 docker 文档和文章之后,我终于发现我错过了实际的数据库名称,谢谢。我试图从容器外部运行命令,但我必须添加 -h 和我的 ip(正确吗?),否则访问被拒绝。进入 bin/bash 我可以看到文件在那里,但不确定它是否被提供。
【解决方案2】:

在与 2 位更了解我工作的后端的同事合作后,这是对我有用的答案。

其实很简单。我在我的仓库中创建了一个空目录。 我将 *.sql 和 *.dmp 添加到我的 .gitignore 中,这样转储文件就不会增加我的图像大小。

使用 docker-compose 的那个目录将被用作 mysql 服务下的一个卷:

volumes:
      - ~/workspace/app:/workspace/app

dump文件放在那里,运行时导入sql服务:

mysql -u app -papp app < /path/to/the/dumpfile

我可以使用 docker exec 进入并验证不仅数据库在那里,而且我的转储文件中的表也在那里。

对我来说,我还必须通过我们的 Django 应用在我的后端容器中创建一个新的超级用户。

python3 manage.py createsuperuser

这样,然后登录 localhost:8000/api,一切都在 mysql、后端和前端容器之间链接起来。

希望这会有所帮助!我敢肯定,对于其他发布卷,并非所有细节都相同,但是使用卷,我不必复制任何转储文件,它最终会自动导入并提供服务。那是我的大问题。

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 2012-03-02
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2015-09-14
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多