如何将一个 MySQL 转储文件导入到 Docker MySQL 容器中

3

您好,非常感谢您的提问。我对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 < /Users/homeImac/Downloads/dump-dev-2020-11-10-22-43-06.dmp

ERROR 1046 (3D000),第22行:未选择数据库

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

ERROR 1046 (3D000),第22行:未选择数据库

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

错误1045(28000):用户'root'@'homeimac'被拒绝访问(使用密码:YES)。这是一个数据库访问权限问题。对于如何导入数据库转储的示例,请参考网络资源。在docker-compose文件中创建容器并导入即可。不一定需要Dockerfile。
db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'app'

我学得非常快,也许太快了。谢谢任何建议!


使用docker cp命令将本地的备份文件复制到正在运行的容器中。然后,您可以使用docker exec命令将备份导入到您的数据库中。 - undefined
似乎起作用了,但不是我预期的结果。我开始使用以下命令: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。这给我输出了数据库中的所有数据,但我无法确定它是否已经导入并正在提供服务。有没有办法可以判断一下?我承认可能使用了错误的命令。谢谢。 - undefined
4个回答

5
您的问题的答案在MySQL的Docker Hub页面中给出,具体请参考https://hub.docker.com/_/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,我可以看到文件在那里,但不确定它是否正在提供服务。 - undefined

2

另一种方式:

docker exec -i containername mysql -uroot -ppassword mysql < dump.sql

从 dump.sql 所在的文件夹中


0
你可以使用docker-compose将数据加载到MySQL中,就像这样:
version: "3"

services:
  load_on_db:
    image: mysql:latest
    entrypoint: "mysql -h $DB_HOST -u $DB_USERNAME --password=$DB_PASSWORD -D $DB_DATABASE -e 'source /data.sql'"
    env_file:
      - .env
    volumes:
      - <PATH_OF_DATA_FOLDER>/data.sql:/data.sql
    extra_hosts:
      - host.docker.internal:host-gateway

显然,你应该将环境变量放入一个名为.env的文件中,或者使用environment关键字来定义它们。此外,你还应该关注MySQL服务器的地址以及从容器中访问它的可行性。如果你的MySQL服务器在容器的主机上运行,根据上述的extra_hosts,你可以使用host.docker.internal作为DB_HOST的值。

0

这是在我与两位在我工作的后端更懂的同事一起努力之后对我有效的答案。

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

使用docker-compose,该目录将作为mysql服务下的一个卷来使用:

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

当我运行时,转储文件被放置在那里,并导入到SQL服务中。

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

我可以使用docker exec进入,并验证数据库和我的转储文件中的表是否存在。

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

python3 manage.py createsuperuser

有了这个,然后在 localhost:8000/api 上登录,mysql、后端和前端容器之间的所有东西都链接起来了。

希望这有所帮助!我确定其他人的帖子卷没有完全相同的细节,但是使用卷,我不需要复制任何转储文件,它最终会自动导入并提供服务。那就是我的主要问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接