Loading...
09-11-2021

In veel gevallen start ik MySql in Docker zo op, dat er een random root wachtwoord wordt aangemaakt. Dit is prima, mits je of het wachtwoord uit de logfile haalt. In het geval dat je deze niet hebt, kan je mogelijk in de problemen komen. Zo liep ik tegen het probleem aan dat binary logging aan stond en m'n schijfruimte vol begon te lopen.

Het gaat in dit geval om MySql 8, hoewel de methode voor een oudere installatie hetzelfde zal zijn, is de sql die uitgevoerd dient te worden wel anders. MySql kan opgestart worden met een initialisatie script, waarmee bijvoorbeeld het wachtwoord wordt aangepast.

We stoppen de container en starten deze weer op buiten het normale proces om. Of te wel, de container wordt gestart maar met bash als startup:

> docker-compose stop mysql
> docker-compose run mysql bash

Hierna zal je in de command prompt terecht komen. We maken een initialisatie script aan met de sql om het wachtwoord aan te passen:

> cat << 'EOF' > mysql-init.sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'super-secret-password';
FLUSH PRIVILEGES

Hierna starten we mysql op via mysqld_safe, met het script als parameter. Door & te gebruiken wacht de shell niet totdat de applicatie klaar is. Hij draait dus in de achtergrond:

> mysqld_safe --init-file=mysql-init.sql &
[1] 7
Logging to '/var/lib/mysql/b96a199271ba.err'.
2021-11-09T09:17:30.107776Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

Overigens lijkt het er wel op dat de shell wacht tot het programma klaar is, maar als je een enter geeft zal er een nieuwe regel met de command prompt getoond worden. Vervolgens wachten we heel even zodat mysql kan starten en het script kan starten. Hierna kunnen we testen of het gelukt is:

> mysql -u root -p"super-secret-password" -h localhost

Als alles gelukt is, zal je hierna inloggen met het nieuwe wachtwoord. We sluiten de container via control+d of exit, en starten deze weer normaal op. Hierna is het mogelijk om als root met het nieuwe wachtwoord in te loggen:

> docker-compose up -d

Aanvullend, om vervolgens de binary log te laten krimpen kan bijvoorbeeld de volgende sql uitgevoerd worden, als root:

PURGE BINARY LOGS BEFORE '2021-11-09'

Update

In de mysql versie die ik later gebruikte, is er geen mysqld_safe commando meer. Dit heeft geloof ik te maken met de overstap naar systemd. Het alternatief hiervoor is om mysql te laten starten met een sql script die het wachtwoord reset. Bij het opstarten worden de scripts uitgevoerd als de root gebruiker. In de directory waar dockercompose.yml staat voer ik het volgende uit:

mkdir startup
cat << 'EOF' > startup/mysql-init.sql
UPDATE mysql.user SET authentication_string=null WHERE User='root';
flush privileges;
EOF

Voeg vervolgens een volume toe aan de dockercompose.yml file: - ./startup:/docker-entrypoint-initdb.d. Herstart hierna de container:

docker-compose restart mysql

Vervolgens kan je als root inloggen zonder wachtwoord. Vergeet niet om het script te verwijderen en het wachtwoord aan te passen

docker-compose exec mysql mysql -u root -p
  • Docker
  • MySql