Passare comandi mysql in un container MariaDB: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| (19 versioni intermedie di uno stesso utente non sono mostrate) | |||
| Riga 14: | Riga 14: | ||
* Container B (Applicazione) | * Container B (Applicazione) | ||
I due container parlano tra di loro tramite la rete di Docker per cui A non ha bisogno di esporre alcuna porta di comunicazione, saremo costretti a trovare un'altra strada per parlare con il container A nel quale gira MariaDB. | I due container parlano tra di loro tramite la rete di Docker per cui A non ha bisogno di esporre alcuna porta di comunicazione, saremo costretti a trovare un'altra strada per parlare con il container A nel quale gira MariaDB. | ||
La | |||
==Workaround== | |||
La soluzione più pulita è utilizzare un container MariaDB solo come client, usare il network condiviso, e lanciare il comando direttamente. Docker Compose crea un network predefinito (di solito nomecontainer_default), dentro quel network i container si vedono col service name (reperipile dal file docker-compose.yml). | |||
Si può verificare il nome della rete con: '''<code>docker network ls</code>''' | |||
<div id="atscreen"> | <div id="atscreen"> | ||
skid@server:~$ docker network ls<br> | skid@server:~$ docker network ls<br> | ||
NETWORK ID NAME DRIVER SCOPE<br> | NETWORK ID NAME DRIVER SCOPE<br> | ||
864d33d040d4 bridge bridge local<br> | 864d33d040d4 bridge bridge local<br> | ||
0a9ae01920f8 | 0a9ae01920f8 AAAA_default bridge local<br> | ||
2f692e7703a0 | 2f692e7703a0 BBBB_default bridge local<br> | ||
122a725b96cf | 122a725b96cf host host local<br> | ||
914723dd5823 | 914723dd5823 RETE_default bridge local<br> | ||
a6638e80949f | a6638e80949f CCCC_default bridge local<br> | ||
3511c1079a34 | 3511c1079a34 DDDD_default bridge local<br> | ||
skid@server:~$ | skid@server:~$ | ||
</div> | </div> | ||
Tra le varie reti listate sappiamo che la rete che ci interessa risulta essere (solo esemplificativamente) '''RETE_default''' | |||
Assumendo che siamo posizionati nella stessa directory del docker-compose.yml possiamo utilizzare la seguente procedura: | |||
<div id="atscreen"> | |||
skid@server:~$docker run -it --rm --network=RETE_default mariadb:10.6 \<br> | |||
mysql -h db -u user_db -ppassword -e "SHOW DATABASES;" | |||
</div> | |||
Dove: | |||
* '''Docker run -i --rm''' → avvia un container temporaneo, che poi si autodistrugge. | |||
* '''--network=RETE_default''' → fa usare al nuovo container la stessa rete del container con il quale dobbiamo interagire, quindi parla con MariaDB via socket TCP interno. | |||
* '''mariadb:10.6''' → scarica ed esegue l’immagine ufficiale MariaDB 10.6 (compatibile con il DB in uso). | |||
* '''mysql -h db -u user_db -ppassword -e "SHOW DATABASES;"''' → esegue la connessione al db sull'host '''db''' (nome del servizio reperito dal docker-compose.yml) utilizzando l'user user_db ('''-u user_db''', reperibile anche questo nel file docker-compose.yml) e la password password (-ppassword sempre dal file docker-compose.yml) ed esegue il comando SQL '''"SHOW DATABASES;"''' | |||
Versione attuale delle 18:16, 29 set 2025
Introduzione
[modifica | modifica sorgente]Può capitare di dover impartire comandi con un client mysql per ottenere output o magari per un dump o un restore di un DB all'interno di un container che fornisce servizio DB tramite server MariaDB, sprovvisto di funzioni client.
Scenario
[modifica | modifica sorgente]- Container A (MariaDB)
- Container B (Applicazione)
I due container parlano tra di loro tramite la rete di Docker per cui A non ha bisogno di esporre alcuna porta di comunicazione, saremo costretti a trovare un'altra strada per parlare con il container A nel quale gira MariaDB.
Workaround
[modifica | modifica sorgente]La soluzione più pulita è utilizzare un container MariaDB solo come client, usare il network condiviso, e lanciare il comando direttamente. Docker Compose crea un network predefinito (di solito nomecontainer_default), dentro quel network i container si vedono col service name (reperipile dal file docker-compose.yml).
Si può verificare il nome della rete con: docker network ls
skid@server:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
864d33d040d4 bridge bridge local
0a9ae01920f8 AAAA_default bridge local
2f692e7703a0 BBBB_default bridge local
122a725b96cf host host local
914723dd5823 RETE_default bridge local
a6638e80949f CCCC_default bridge local
3511c1079a34 DDDD_default bridge local
skid@server:~$
Tra le varie reti listate sappiamo che la rete che ci interessa risulta essere (solo esemplificativamente) RETE_default Assumendo che siamo posizionati nella stessa directory del docker-compose.yml possiamo utilizzare la seguente procedura:
skid@server:~$docker run -it --rm --network=RETE_default mariadb:10.6 \
mysql -h db -u user_db -ppassword -e "SHOW DATABASES;"
Dove:
- Docker run -i --rm → avvia un container temporaneo, che poi si autodistrugge.
- --network=RETE_default → fa usare al nuovo container la stessa rete del container con il quale dobbiamo interagire, quindi parla con MariaDB via socket TCP interno.
- mariadb:10.6 → scarica ed esegue l’immagine ufficiale MariaDB 10.6 (compatibile con il DB in uso).
- mysql -h db -u user_db -ppassword -e "SHOW DATABASES;" → esegue la connessione al db sull'host db (nome del servizio reperito dal docker-compose.yml) utilizzando l'user user_db (-u user_db, reperibile anche questo nel file docker-compose.yml) e la password password (-ppassword sempre dal file docker-compose.yml) ed esegue il comando SQL "SHOW DATABASES;"