2017-10-05 6 views
0

Ich bin sicher, dass dies ein dupliziertes Thema ist, aber ich kann es einfach nicht erledigen: Ich möchte meine Datenbank-Dump in MySQL-Container zur Laufzeit wiederherstellen, ohne die Docker zu ändern -compose.yml Datei.Wiederherstellen von MySQL-Dump von Host auf Docker-Container

Dockerfile

FROM php:5.4.45-apache 
RUN apt-get update 
RUN docker-php-ext-install mysql mysqli 

Docker-compose.yml

version: '2' 
services: 
    php_service: 
    container_name: my_php 
    # Use Dockerfile in this dir to build the image 
    build: . 
    # Stop containers always after exiting. 
    restart: always 
    ports: 
     # 'localhost' does not works from the host, but the IP of docker itself 
     # (192.168.99.100 for example - shown on the top of the console) 
     - "80:80" 
     - "443:443" 
    environment: 
     # Pass variables 
     - API_TOKEN=xxxx 
    volumes: 
     # The current directory will be mounted to '/var/www/html' 
     # WORKS ONLY IN USER'S DIR ON WINDOWS (~/Downloads for example) 
     - .:/var/www/html 
    # See https://hub.docker.com/_/mysql/ for additional information. 
    # To open up console, run `docker exec -it my_mysql bash`. 
    # To restore a dump `docker exec -i my_mysql /usr/bin/mysql -u root 
    # --password=test_pass DATABASE < DUMP.sql` should work, but it never did. 
    mysql_service: 
    container_name: my_mysql 
    # Use an existing image 
    image: mysql:5.6 
    restart: always 
    ports: 
     # Let it accessible for other apps (mysql on host, IDE, etc.) 
     - "3306:3306" 
    environment: 
     MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this 
     MYSQL_USER: 'test' 
     MYSQL_PASS: 'pass' 
    volumes: 
     # Named volumes (my-datavolume) has to be listed in the "volumes" 
     # section - I don't know how it works or what is it doing at all... 
     # (-_-') 
     - my-datavolume:/var/lib/mysql 
volumes: 
    my-datavolume: 

Schritte zum Reproduzieren:

  • starten Docker Toolbox auf Windows 7 Host
  • docker-compose up
  • Öffnen Sie ein neues Docker Toolbox Terminal
  • docker exec my_msql /usr/bin/mysql -u root --password=test_pass -e 'CREATE DATABASE testdb;'
  • docker exec -i my_mysql /usr/bin/mysql -u root --password=test_pass testdb < dump_on_host.sql
  • docker exec -it my_mysql /usr/bin/mysql -u root --password=test_pass testdb
  • mysql> SHOW TABLES;

Die Datenbank ist leer. Es scheint, dass es nichts tut, weil das Terminal zu schnell reagiert. Ich habe den Dump ausprobiert, indem ich MySQL auf meinem Host installiert habe, es kann wiederhergestellt werden.

+0

Haben Sie die richtige Ausgabe zu erhalten für so etwas wie 'Docker exec -i my_mysql wc Thilo

+0

Danke für den Vorschlag - es sagt, die Eingabe ist leer ('0 0 0'). – bimlas

+0

Angenommen, die Datei ist wirklich da, vielleicht hat die Pipe nicht funktioniert? Versuchen Sie 'cat dump_on_host.sql | Docker Exec ...' – Thilo

Antwort

1

Versuch unten Befehl funktioniert gut für mich.

Führen Sie es von Docker Host-Maschine.

Backup-

Docker exec CONTAINER/usr/bin/mysqldump -u root --password = root DATABASE> backup.sql

wiederherstellen
Katze backup.sql | Docker exec -i CONTAINER/usr/bin/mysql -u root --password = root DATABASE

Bitte lassen Sie mich jede Frage im Fall wissen.

+0

Siehe die Kommentare für die Eröffnungsbotschaft. – bimlas

0

Sie verwenden ein Volume, das bedeutet, dass die Daten nach dem Wiederherstellen des Abbilds erhalten bleiben.

Sie geben auch die Datenbank in Port 3306 frei, sodass eine Lösung möglicherweise darin besteht, über einen Client eine Verbindung zur Datenbank herzustellen. Sie können sich mit einem grafischen Client wie MySql Workbench mit mysql verbinden und die Datenbank von dort wiederherstellen.

Oder wenn Sie mysql in der Befehlszeile

$ mysql --host=127.0.0.1 --port=3306 -u test -p testdb < dump_on_host.sql 
Verwandte Themen