导入data.sql MySQL Docker容器

Isr*_*les 67 mysql docker

如果我有一个data.sql,如何将数据库导入我的mysql docker容器?我如何导入数据库数据.在码头世界中,这增加了一层复杂性.请问一些方法.

在这里我的docker-compose.yml:

nginx:
  build: ./nginx/
  container_name: nginx-container
  ports:
    - 80:80
  links:
    - php
  volumes_from:
    - app-data

php:
  build: ./php/
  container_name: php-container
  expose:
    - 9000
  links:
    - mysql
  volumes_from:
    - app-data

app-data:
  image: php:7.0-fpm
  container_name: app-data-container
  volumes:
    - ./www/html/:/var/www/html/
  command: "true"

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes_from:
    - mysql-data
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

mysql-data:
  image: mysql:latest
  container_name: mysql-data-container
  volumes:
    - /var/lib/mysql
  command: "true"
Run Code Online (Sandbox Code Playgroud)

Lau*_*uri 119

您可以在以后导入数据库:

docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql

  • 如果使用docker-compose,你必须通过以下方式获取容器:`docker exec -i $(docker-compose ps -q mysql-container)mysql ...`.它现在不支持从stdin读取,如[here](https://github.com/docker/compose/issues/3352)所述. (19认同)
  • 我是。出现错误“输入设备不是TTY” (4认同)
  • 如何在 docker-compose 上做到这一点? (2认同)
  • @kamal你是否使用了“docker exec”的“-t”选项?请使用“-i”来避免错误 (2认同)

Eug*_*yer 67

/docker-entrypoint-initdb.d/yourdump.sql使用卷装载挂载sql-dump

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes:
    - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password
Run Code Online (Sandbox Code Playgroud)

这将在容器启动期间触发sql-dump的导入,请参阅 "初始化新实例"下的https://hub.docker.com/_/mysql/

  • 伙计们,请记住,如果为数据库服务创建持久卷,除非重新创建,否则它不会检查新的.sql文件.失去了几个小时,我希望没有其他人经历过同样的事情. (14认同)
  • +1 @EugenMayer.绝对任何使用Compose v1的人都应该转向最新的v3语法:https://docs.docker.com/compose/compose-file/ (3认同)
  • V3 并不是 V2 的继承者,即使这会带来不便。V3 基本上只是 swarm,它更像是一个分叉而不是后继者。请参阅 Docker 对此的评论。最大的问题之一是缺少volumr_from挂载的可能性 (2认同)

Han*_*rus 40

我似乎无法使用最新的mysql或mysql:5.7.所以我改用mariaDB.这是我的docker-compose.yaml代码.

version: '3'

services:
  mysql:
    image: mariadb:10.3
    container_name: mariadb
    volumes:
      - container-volume:/var/lib/mysql
      - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: name_db
    ports:
      - "3306:3306"

volumes:
  container-volume:
Run Code Online (Sandbox Code Playgroud)


Exc*_*nmi 22

如果您不想安装卷,但想从本地计算机转储文件,则另一个选项是管道cat yourdump.sql.像这样:

cat dump.sql | docker exec -i mysql-container mysql -uuser -ppassword db_name
Run Code Online (Sandbox Code Playgroud)

请参阅:https: //gist.github.com/spalladino/6d981f7b33f6e0afe6bb


Sli*_*eam 9

使用docker-compose导入

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>
Run Code Online (Sandbox Code Playgroud)


Sak*_*sem 9

先做docker cp file.sql <CONTAINER NAME>:/file.sql

然后docker exec -it <CONTAINER NAME> mysql -u user -p

然后在mysql容器内执行source \file.sql


小智 8

结合/sf/answers/3628651351/ 和这个问题的答案,我认为最好的答案是:

cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"
Run Code Online (Sandbox Code Playgroud)

例如,在我的系统中,此命令应如下所示:

cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
Run Code Online (Sandbox Code Playgroud)

您也可以使用pv来监控进度:

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
Run Code Online (Sandbox Code Playgroud)

这里最重要的是“--init-command”,它可以将导入进度加快 10 倍。


Tun*_*gac 8

只需编写docker ps并获取容器 ID,然后编写以下内容;

docker exec -i your_container_id mysql -u root -p123456 your_db_name < /Users/your_pc/your_project_folder/backup.sql
Run Code Online (Sandbox Code Playgroud)


小智 7

我可以用这个命令导入

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql
Run Code Online (Sandbox Code Playgroud)


Tha*_*mit 6

您可以按照以下简单步骤操作:

第一种方式:

首先将 SQL 转储文件从本地目录复制到 mysql 容器。使用 docker cp 命令

docker cp [SRC-Local path to sql file] [container-name or container-id]:[DEST-path to copy to]

docker cp ./data.sql mysql-container:/home
Run Code Online (Sandbox Code Playgroud)

然后使用执行 mysql-container (注意:如果您使用的是 alpine 版本,则需要在下面给出的命令中将 bash 替换为 sh 。)

docker exec -it -u root mysql-container bash
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地导入这个 SQL 转储文件。

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql
Run Code Online (Sandbox Code Playgroud)

第二种方式:简单

docker cp ./data.sql mysql-container:/docker-entrypoint-initdb.d/
Run Code Online (Sandbox Code Playgroud)

正如 mysql Docker hub 官方页面中提到的。

每当容器第一次启动时,都会使用 MYSQL_DATABASE 变量中指定的名称创建一个新数据库 - 您可以通过设置环境变量来传递该数据库,请参阅此处如何设置环境变量

默认情况下,容器将执行在 /docker-entrypoint-initdb.d 文件夹中找到的扩展名为 .sh、.sql 和 .sql.gz 的文件。文件将按字母顺序执行。这样,您的 SQL 文件将默认导入到 MYSQL_DATABASE 变量指定的数据库中。

欲了解更多详情,您可以随时访问官方页面


小智 6

尝试"docker exec ... < data.sql"在 Window PowerShell 响应中使用:

“<”运算符保留供将来使用。

但我们可以用以下方法cmd /c解决这个问题:

cmd /c "docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql"
Run Code Online (Sandbox Code Playgroud)