2015-08-15 16 views
14

Sto tentando di creare un database/schema mysql se non esiste già.Uso di docker-compose per creare uno schema/database MySQL

Ecco che cosa ho provato:

finestra mobile-compose.yml

mysql: 
    image: mysql:5.6.26 
    environment: 
    - MYSQL_ROOT_PASSWORD=root 
    command: "mysql -uroot -proot < createDB.sql" 
    ports: 
    - "3306:3306" 

CreateDB.sql

CREATE DATABASE IF NOT EXISTS bignibou; 

Non funziona. Quale sarebbe il modo migliore di usare docker/docker-compose per creare uno schema se non esiste?

+0

Does createDB.sql hanno 'USE bignibou;' come prima riga? –

+0

No. Non ha questa linea ... – balteo

+0

Il problema con la mia finestra mobile-compose sopra è che 'comando:' dovrebbe eseguire il contenitore. Sto quindi cercando un modo per eseguire un comando post sul contenitore ... – balteo

risposta

19

ho finalmente trovato l'inizio di una soluzione.

L'immagine MySQL prende una variabile d'ambiente cioè MYSQL_DATABASE che inizializzare il contenitore con il nome del database all'avvio immagine Vedi qui per il pieno documentation.

O leggere l'estratto qui sotto:

MYSQL_DATABASE

Questa variabile è opzionale e consente di specificare il nome di un database da creare all'avvio immagine. Se è stato fornito un utente/password (vedi sotto), all'utente verrà concesso l'accesso come superutente (corrispondente a GRANT ALL) a questo database.

Ecco quello che mi si avvicinò con:

mysql: 
    image: mysql:5.6.26 
    environment: 
    - MYSQL_ROOT_PASSWORD=root 
    - MYSQL_DATABASE=bignibou 
    ports: 
    - "3306:3306" 

io ora bisogno di un modo per specificare le regole di confronto di default, ma questa è un'altra storia ...

modificare: Per chi fosse interessato nel specificare un confronto diverso da quello predefinito, ecco le istruzioni per usare un altro file di configurazione che sovrascriverà quello predefinito. Vedere di seguito:

utilizzo di un file di configurazione di MySQL personalizzato L'avvio di configurazione di MySQL è specificata nel file /etc/mysql/my.cnf, e che di file a sua volta include tutti i file si trovano in/etc/mysql /conf.d directory che termina con .cnf. Le impostazioni nei file in questa directory saranno e/o sovrascriveranno le impostazioni in /etc/mysql/my.cnf.Se si desidera che utilizzi una configurazione MySQL personalizzata, è possibile creare il proprio file di configurazione alternativo in una directory sul computer host e quindi installare tale percorso di directory come /etc/mysql/conf.d all'interno del contenitore mysql .

Se /my/custom/config-file.cnf è il percorso e il nome del file di configurazione personalizzata , si può iniziare il vostro contenitore mysql come questo (notare che solo il percorso della directory del file di configurazione personalizzata viene utilizzato in questo comando ):

$ Docker corrono --name qualche-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD = my-secret-pw -d mysql: tag questo avvierà un nuovo contenitore mysql dove l'istanza MySQL utilizza le impostazioni di avvio combinate da /etc/mysql/my.cnf e /etc/mysql/conf.d/config-file.cnf, con impostazioni da quest'ultimo ha la precedenza.

+0

Fidati di me: molto più facile con gli script e un Dockerfile – Grasshopper

+3

Ecco un modo per specificare le regole di confronto predefinite nel file docker-compose.yml: mysql: immagine: mysql: 5.7 comando: [mysqld, --character-set- server = utf8mb4, --collation-server = utf8mb4_unicode_ci] – William

0

Dalla documentazione docker-comporre - see Define Services - è possibile indicare quale Dockerfile verrà utilizzato per creare l'immagine. Quindi puoi creare un Dockerfile basato sull'immagine mysql e creare il database al suo interno usando i comandi standard Dockerfile.

+0

Ciao. Umm. L'unico problema è che se voglio passare ad un'altra versione di mysql, ho bisogno di cambiare il Dockerfile e aggiornarlo con il mio comando personalizzato che crea il database. Non è un grosso problema, ma non completamente pulito in quanto non sto estendendo il Dockerfile ma modificandolo ... – balteo

1

probabilmente quello che stai cercando di fare ha bisogno di uno script aggiuntivo. Quindi se la costruzione di un'immagine invece di utilizzare direttamente un'immagine predefinita è un'opzione per te, devi usare un Dockerfile e usare un file di script che prima importa lo script in MySql e poi esegue il servizio stesso.

un'occhiata a questa risposta: Docker - Initialize mysql database with schema

+0

Ciao @mohamnag e grazie per la tua risposta! Ho aggiunto un commento alla risposta di Grasshopper che si applica anche al tuo post. – balteo

+0

il collegamento sopra menzionato è la situazione in cui si ha un file di dati e non si sa se DB è solo uno nuovo o uno più vecchio che non deve essere inizializzato. la soluzione migliore nel tuo caso dipende molto da quale versione deve essere aggiornata a quale versione. alcune volte montando un volume esterno e riutilizzandolo su uno nuovo funzionerà a volte no. – mohamnag

0

Questo potrebbe essere utile nel caso in cui qualcuno arrivi qui in futuro. Il vero problema sembra essere l'istruzione "comando" nel file di composizione docker. Una volta completato correttamente il comando, il contenitore verrà distrutto. Questo script sql deve essere eseguito solo dopo che è stata eseguita la finestra di dialogo-compose e sono stati creati i contenitori. docker-compose "command" serve davvero per avviare un servizio nel container. In questo caso hai annullato il servizio mysql con il tuo comando.

Problemi correlati