Импорт data.sql MySQL Docker Container

Если у меня есть 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"

Ответ 1

Я не могу заставить это работать с последними 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:

Ответ 2

После этого вы можете импортировать базу данных:

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

Ответ 3

Смонтируйте свой sql-dump в /docker-entrypoint-initdb.d/yourdump.sql используя монтирование тома

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

Это запустит импорт sql-дампа во время запуска контейнера, см. Https://hub.docker.com/_/mysql/в разделе "Инициализация свежего экземпляра".

Ответ 4

Другой вариант, если вы не хотите монтировать том, но хотите создать дамп файла с вашего локального компьютера, - это cat yourdump.sql. Вот так:

cat dump.sql | docker exec -i mysql-container mysql -uuser -ppassword db_name

Смотрите: https://gist.github.com/spalladino/6d981f7b33f6e0afe6bb

Ответ 5

Импорт с использованием docker-compose

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>

Ответ 6

объединить fooobar.com/questions/13241243/... и ответы на этот вопрос, я думаю, что лучший ответ:

cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"

например, в моей системе эта команда должна выглядеть так:

cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

Также вы можете использовать для ру MONITER прогресса:

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

И самая важная вещь здесь - это --init-command, которая ускорит процесс импорта в 10 раз быстрее.

Ответ 7

Вы можете запустить контейнер, задав общий каталог (том -v), а затем запустить bash в этом контейнере. После этого вы можете интерактивно использовать mysql-client для выполнения файла .sql изнутри контейнера. obs: /my-host-dir/shared-dir - это расположение .sql в хост-системе.

docker run --detach --name=test-mysql -p host-port:container-port  --env="MYSQL_ROOT_PASSWORD=my-root-pswd" -v /my-host-dir/shared-dir:/container-dir mysql:latest


docker exec -it test-mysql bash

Внутри контейнера...

mysql -p < /container-dir/file.sql 

Пользовательские параметры:

  • test-mysql (имя контейнера)
  • хост-порт и контейнер-порт
  • my-root-pswd (пароль root для mysql)
  • /my-host-dir/shared-dir и /container-dir (каталог хоста, который будет смонтирован в контейнере, и местоположение контейнера общего каталога)

Ответ 8

Вы можете скопировать файл экспорта, например, для dump.sql, используя docker cp, в контейнер, а затем импортировать базу данных. если вам нужны полные инструкции, дайте мне знать, и я предоставлю

Ответ 9

Я могу импортировать с помощью этой команды

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql