wake-up-neo.com

Docker-Compose verwenden, um ein MySQL-Schema/eine Datenbank zu erstellen

Ich versuche, eine MySQL-Datenbank/ein Schema zu erstellen, falls diese noch nicht vorhanden ist. 

Folgendes habe ich ausprobiert:

docker-compose.yml

mysql:
  image: mysql:5.6.26
  environment:
   - MYSQL_ROOT_PASSWORD=root
  command: "mysql -uroot -proot < createDB.sql"
  ports:
    - "3306:3306"

createDB.sql

CREATE DATABASE IF NOT EXISTS bignibou;

Es funktioniert nicht. Was wäre der beste Weg, um Docker/Docker-Compose zu verwenden, um ein Schema zu erstellen, wenn es nicht existiert?

17
balteo

Ich habe endlich den Anfang einer Lösung gefunden.

Das MySQL-Image verwendet eine Umgebungsvariable, dh MYSQL_DATABASE , die den Container beim Start des Images mit dem Namen der Datenbank initialisiert. Eine vollständige Dokumentation finden Sie hier .

Oder lesen Sie den folgenden Auszug:

MYSQL_DATABASE

Diese Variable ist optional und ermöglicht es Ihnen, den Namen einer Datenbank anzugeben, die beim Start des Images erstellt werden soll. Wenn ein Benutzer/Passwort angegeben wurde (siehe unten), wird diesem Benutzer der Superuser-Zugriff (entsprechend GRANT ALL) auf diese Datenbank gewährt.

Folgendes habe ich mir ausgedacht:

mysql:
  image: mysql:5.6.26
  environment:
   - MYSQL_ROOT_PASSWORD=root
   - MYSQL_DATABASE=bignibou
  ports:
    - "3306:3306"

Ich brauche jetzt eine Möglichkeit, die Standardkollatierung anzugeben, aber das ist eine andere Geschichte ...

edit : Für diejenigen, die eine vom Standard abweichende Sortierung angeben möchten, finden Sie hier die Anweisungen zur Verwendung einer anderen Konfigurationsdatei, die die Standarddatei überschreibt. Siehe unten:

Verwenden einer benutzerdefinierten MySQL-Konfigurationsdatei Die MySQL-Startkonfiguration wird in der Datei /etc/mysql/my.cnf angegeben. Diese Datei enthält wiederum alle Dateien im Verzeichnis /etc/mysql/conf.d, die mit .cnf enden. Einstellungen in Dateien in diesem Verzeichnis erweitern und/oder überschreiben die Einstellungen in /etc/mysql/my.cnf. Wenn Sie eine angepasste MySQL-Konfiguration verwenden möchten, können Sie Ihre alternative Konfigurationsdatei in einem Verzeichnis auf dem Host-Computer erstellen und dieses Verzeichnis dann als /etc/mysql/conf.d im mysql-Container bereitstellen.

Wenn /my/custom/config-file.cnf der Pfad und der Name Ihrer benutzerdefinierten Konfigurationsdatei ist, können Sie Ihren mysql-Container folgendermaßen starten (beachten Sie, dass in diesem Befehl nur der Verzeichnispfad der benutzerdefinierten Konfigurationsdatei verwendet wird):

$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD = my-secret-pw -d mysql: tag Hiermit wird ein neuer Container some-mysql gestartet, in dem MySQL installiert ist Die Instanz verwendet die kombinierten Starteinstellungen von /etc/mysql/my.cnf und /etc/mysql/conf.d/config-file.cnf, wobei die Einstellungen der letzteren Vorrang haben.

23
balteo

Um Ihre Daten nicht zu verlieren, verwenden Sie auch Volumes besser:

version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
        - mysql-db:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: my_db_name
    ports:
        - "3307:3306"
volumes:
  mysql-db:
3
Codenator81

was Sie zu tun versuchen, erfordert wahrscheinlich ein zusätzliches Skript. Wenn Sie also ein Image erstellen und nicht direkt ein vorgefertigtes Image verwenden möchten, müssen Sie eine Dockerfile und eine Scriptdatei verwenden, die das Script zuerst in MySql importiert und dann den Dienst selbst ausführt.

sehen Sie sich diese Antwort an: Docker - Mysql-Datenbank mit Schema initialisieren

1
mohamnag

In der Docker-Compose-Dokumentation - siehe Define Services - können Sie feststellen, welche Docker-Datei zum Erstellen des Images verwendet wird. Daher können Sie eine Dockerfile basierend auf dem mysql-Abbild erstellen und die Datenbank darin mithilfe von Dockerfile-Standardbefehlen erstellen.

0
Grasshopper

Dies kann nützlich sein, wenn in Zukunft jemand hier landet. Das eigentliche Problem scheint die "command" -Anweisung in der Docker-Compose-Datei zu sein. Wenn der Befehl erfolgreich abgeschlossen wurde, wird der Container zerstört. Dieses SQL-Skript muss nur ausgeführt werden, nachdem docker-compose ausgeführt wurde und Container erstellt wurden. docker-compose "command" soll wirklich einen Dienst im Container starten. In diesem Fall haben Sie den mysql-Dienst mit Ihrem Befehl überschrieben.

0
Dean Sha