Quando si utilizza MySQL in un ambiente Docker, è spesso utile o necessario inizializzare il database con dati o configurazioni personalizzate al primo avvio. Questo è possibile grazie alla funzionalità nativa di MySQL Docker che esegue automaticamente gli script presenti nella directory /docker-entrypoint-initdb.d.
Struttura dei file
Per prima cosa, organizza il tuo progetto in una directory con la seguente struttura:
mysql-init/
├── docker-compose.yml
└── init/
    └── init.sqlCreazione dello script di inizializzazione
Nel file init/init.sql puoi inserire qualsiasi comando SQL che desideri venga eseguito al primo avvio del container. Ad esempio:
CREATE DATABASE IF NOT EXISTS my_db;
USE my_db;
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);
INSERT INTO users (name, email) VALUES
('Mario Rossi', 'mario@example.com'),
('Luisa Verdi', 'luisa@example.com');Scrivere il file docker-compose.yml
Nel file docker-compose.yml definisci il servizio MySQL e monta la directory degli script SQL:
services:
  mysql:
    image: mysql:8
    container_name: mysql_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password123
      MYSQL_DATABASE: my_db
    ports:
      - "3306:3306"
    volumes:
      - ./init:/docker-entrypoint-initdb.dAvviare il container
Posizionati nella directory mysql-init e avvia il container con:
docker compose up -dMySQL verrà avviato e lo script init.sql verrà eseguito automaticamente durante il primo avvio. Gli script non verranno rieseguiti nei successivi avvii, a meno che non si elimini il volume dei dati associato al container.
Verifica
Per connetterti al database ed eseguire una verifica, puoi usare il client MySQL da un altro container o dalla tua macchina locale:
docker exec -it mysql_db mysql -u root -pDopo aver inserito la password (password123), puoi eseguire una query per verificare la presenza dei dati:
USE my_db;
SELECT * FROM users;Conclusione
Utilizzare docker compose con MySQL e script di inizializzazione ti consente di creare ambienti riproducibili e automatizzati per lo sviluppo e il testing. Questo approccio è particolarmente utile per applicazioni che richiedono una configurazione o dei dati iniziali specifici.