SQL Passworteingabe für root@localhost per Konfigurationsdatei deaktivieren

vilbel

Lt. Junior Grade
Registriert
Mai 2014
Beiträge
296
Hallo,

ich hoffe dieses Thema ist im richtigen Unterforum. Es geht darum, dass ich MySQL-Datenbanken in einem lauffähigen Docker-Container importieren will. Konkret: Das Docker-Image des Containers wird über das Dockerfile erstellt. Das habe ich schon erledigt und der Container ist einsatzbereit, d. h. MySQL läuft problemlos in dem Container. Der nächste Schritt besteht jetzt darin, die vorhandenen Datenbanken in den Container zu importieren. Und das möchte ich im Container über ein Shell-Skript folgendermaßen gestalten:

Beispiel für Codezeile im Shellskript example.sh: mysql < sql-befehle.sql

Das Shell-Skript soll über eine explizite Angabe im Dockerfile (über den ADD-Befehl) in das Image integriert werden und somit im Container dann später verfügbar sein. Über eine weitere Angabe im Dockerfile (RUN example.sh) soll dann dieses Skript automatisch beim Start des Containers ablaufen. Nun zum eigentlichen Problem: Es kommt eine Fehlermeldung beim Absetzen des Befehls mysql < sql-befehle.sql (Permission denied). Wie kann ich den MySQL-Account root@localhost so konfigurieren, dass ich den Befehl mysql < sql-befehle.sql ohne Eingabe eines Passworts ausführen kann? Das benötige ich als zwingende Voraussetzung dafür, dass mein Shell-Skript auch funktioniert.
Das Problem hierbei: Reiner SQL-Code zur Änderung des Passworts von root@localhost bringt mir nichts, da auch hier ein Passwort für root@localhost abgefragt wird. Es muss also über eine Konfigurationsdatei möglich sein, die Passworteingabe für root@localhost zu deaktivieren. Wie kann ich das erreichen?
 
Die Quick'n'Dirty Variante: Das Kennwort als Variable im Dockerfile (oder in einem extra config file) ablegen und dann die Variable im Script aufrufen.
Die "sauberere" Variante hat konkreter zwischenzeitlich ja gepostet.
 
Ich weiss nicht ob dein Docker image ein /etc/container_environment Verzeichnis hat.
Sollte es vorhanden sein dann koenntest du folgenden Befehl ausfuehren:

Bash:
mysql -u root --password=`cat /etc/container_environment/MYSQL_ROOT_PASSWORD` < sql-befehle.sql

MYSQL_ROOT_PASSWORD muss dann natuerlich als Umgebungsvariable gesetzt sein.
 
Danke für eure Antworten! Ich habe den Vorschlag von konkretor aufgegriffen, weil ich schon diesen Ansatz verfolgt habe. In meiner .my.cnf-Datei stand nur der Eintrag mit
[mysql]
user=root
password="passw"
drinnen. Deshalb ging es anscheinend nicht, weil die anderen Einträge ([client] usw.) fehlten. Aber jetzt funktioniert es. Ich kann, wenn ich im laufenden Betrieb mit Hilfe des Befehls docker exec -it [Mein Container-Name] /bin/bash in die Shell komme, die Anweisung mysql < sql-befehle.sql ohne Probleme ausführen. Auch die gewünschten Datenbanken und zugehörigen Daten sind anschließend in der Datenbank zu finden.

Nur eine Sache funktioniert noch nicht ganz rund: Ich möchte die Anweisung mysql < sql-befehle.sql in einem Shell-Skript verpackt automatisch beim Start des Containers mit docker run --name [Mein-Container-Name] -d -e MYSQL_ROOT_PASSWORD=password laufen lassen. Daher habe ich mir gedacht, dass ich eine einfache if-Abfrage ian das Ende des Shell-Skripts docker-entrypoint.sh des fertigen Images MySQL-Images von Docker-Hub integriere und dieses erweiterte (von mir modifizierte) Shell-Skript über das Dockerfile an die ursprüngliche Stelle im Container kopiere. Problem dabei: Der Import findet trotz der if-Abfrage (siehe unten) nicht statt. Ich habe das auch mit docker exec -it [Mein Container-Name] /bin/bash überprüft. An was kann das liegen?

Die if-Abfrage lautet:

if [ -f test.txt ]
then echo "Import hat schon stattgefunden. Überspringe Dateiimport...";
else echo "Führe Datenimport aus...";
mysql < sql-befehle.sql;
touch test.txt;
fi

Ich verwende dieses offizielle Basis-Image: https://hub.docker.com/_/mysql/
Anmerkung: Das Skript docker-entrypoint.sh hat Ausführungsrechte. Daran kann es nicht liegen.
 
Zurück
Oben