Extra SQL uitvoeren bij aanmaken van een docker database container via docker-entrypoint-initdb.d

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.

Plaats een reactie