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.sql
Creazione 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.d
Avviare il container
Posizionati nella directory mysql-init
e avvia il container con:
docker compose up -d
MySQL 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 -p
Dopo 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.