Extra Mysql database aanmaken bij opstarten Docker project.
In de meeste gevallen gebruik ik SQLlite als database voor (unit)testen. Deze keer had ik
LOAD DATA LOCAL INFILE
nodig en die functie heeft SQLlite niet.
Er moet dus nog een Mysql database worden aangemaakt voor het testen. Na wat onderzoek is dit mogelijk om een volume te mounten in docker-entrypoint-initdb.d.
Docker-compose database config
Zo ziet mijn configuratie eruit om een Mysql container op te zetten:
mysql:
image: mysql:5.7.29
container_name: mysql
restart: always
ports:
- "3307:3306"
environment:
MYSQL_DATABASE: laravel_db
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret123
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- laravel_project
volumes:
- ./sql_scripts:/docker-entrypoint-initdb.d
- ./mysql:/var/lib/mysql
Ik heb een ‘sql_scripts’ directory in de root van het project en daarin een .sql script om te database aan te maken
CREATE DATABASE test_database;
Om deze directory te mounten aan docker-entrypoint-initdb.d zal bij het aanmaken van de container dit script worden uitgevoerd.
- ./sql_scripts:/docker-entrypoint-initdb.d
Zorg ervoor dat de directory mysql nog niet bestaat
Zoals je ziet mounten we ook de directory mysql in de root van het project.
Bestaat deze folder al dan zal het script niet worden uitgevoerd. Maak daarom een backup van je database(s), verwijder deze folder, daarna de container en bouw de container opnieuw op.
docker-entrypoint-initdb.d voert mijn sql script niet uit
Ik heb aardig wat uurtjes lopen kl*ten om het werkend te krijgen. Had in mijn configuratie voor docker-compose het volgende:
- environment:
- MYSQL_DATABASE: laravel_db
- MYSQL_USER: root
- MYSQL_PASSWORD: secret
- MYSQL_ROOT_PASSWORD: secret
- SERVICE_TAGS: dev
- SERVICE_NAME: mysql
Hij voerde het script nu niet uit. Door
- MYSQL_USER: root
weg te halen werkt het wel…vreemd.