Passare comandi mysql in un container MariaDB: differenze tra le versioni

Da ElettraWiki.
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 36: Riga 36:


<div id="atscreen">
<div id="atscreen">
docker run -it --rm --network=RETE_default mariadb:10.6 \
docker run -it --rm --network=RETE_default mariadb:10.6 \<br>
mysql -h db -u user_db -ppassword -e "SHOW DATABASES;"
mysql -h db -u user_db -ppassword -e "SHOW DATABASES;"
</div>
</div>
Riga 42: Riga 42:
Dove:
Dove:
* Docker run -i --rm → avvia un container temporaneo, che poi si autodistrugge.
* Docker run -i --rm → avvia un container temporaneo, che poi si autodistrugge.
* --network=container:mediawiki_db → fa usare al nuovo container la stessa rete del container mediawiki_db, quindi parla con MariaDB via socket TCP interno.
* --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.
* -v $(pwd)/wikidb.sql:/wikidb.sql → monta il file wikidb.sql dell’host dentro al container temporaneo.
* mariadb:10.6 → scarica ed esegue l’immagine ufficiale MariaDB 10.6 (compatibile con il DB in uso).
* mariadb:10.6 → scarica ed esegue l’immagine ufficiale MariaDB 10.6 (compatibile col tuo DB).
* 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;"
* mysql -u mediawiki -paacantis mediawiki < /wikidb.sql → esegue l’import del dump nel DB mediawiki con utente/password definite nel tuo docker-compose.yml

Versione delle 18:12, 29 set 2025


Introduzione

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

  • 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

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:

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;"