Dovrei usare la finestra mobile comporre o eseguire?


129

C'è un motivo per usare runper avviare un docker-compose.ymlfile o dovresti semplicemente usare up?

Comprendo che runpuò avviare un contenitore specifico, ma mi riferisco al caso in cui lo si utilizza senza specificare un contenitore in modo che avvii tutti i contenitori YML.

Risposte:


141

Come menzionato in docker-compose run(2015)

Il comando passato da run ha la precedenza sul comando definito nella configurazione del servizio .
Ad esempio, se la configurazione del servizio Web viene avviata con bash, la docker-compose run web python app.pysovrascrive con python app.py.

La seconda differenza è che il docker-compose runcomando non crea nessuna delle porte specificate nella configurazione del servizio .
Ciò impedisce le collisioni delle porte con porte già aperte. Se vuoi che le porte del servizio vengano create e mappate sull'host, specifica il flag --service-doors:

$ docker-compose run --service-ports web python manage.py shell

Quindi, a meno che tu non abbia tali esigenze specifiche (sovrascrivendo un comando o eseguendo solo un contenitore su porte diverse), docker-compose up(anche per un contenitore) è sufficiente.

Potete aiutarmi a spiegare perché o quando non si desidera creare le porte? Ecco perché o quando potrebbero entrare in conflitto con porte già aperte

Semplicemente perché docker-compose runè fatto per eseguire comandi una tantum per i tuoi servizi.
Ciò significa che, se hai già fatto un docker-compose up, tutti i tuoi contenitori sono già in esecuzione sulle porte specificate da docker-compose.yml.
Fare un docker-compose runa questo punto (per eseguire un comando una tantum), se rispettasse la stessa porta, fallirebbe immediatamente. Da qui la non creazione predefinita di tali porte.


Un altro caso d'uso (nel riferimento alle variabili di ambiente Compose ):

Per vedere quali variabili di ambiente sono disponibili per un servizio, eseguire docker-compose run SERVICE env.


La versione più recente (2019+) di questi comandi è attiva docker/docker.github.io:


27

Vorrei sottolineare che se si utilizza Python con il debugger pdb:

import pdb; pdb.set_trace()

Non passerà alla shell se esegui lo script usando:

docker-compose up

Tuttavia, se si utilizza Esegui, verrà visualizzato nel debugger come previsto:

docker-compose run

7

C'è una risposta dai documenti docker .

In genere, vuoi docker-compose up. Utilizzare upper avviare o riavviare tutti i servizi definiti in a docker-compose.yml. Nella modalità "collegata" predefinita, vengono visualizzati tutti i registri di tutti i contenitori. In modalità "scollegata" ( -d), Compose esce dopo l'avvio dei contenitori, ma i contenitori continuano a funzionare in background.

Il docker-compose runcomando serve per eseguire attività "una tantum" o "ad hoc". Richiede il nome del servizio che si desidera eseguire e avvia i contenitori solo per i servizi da cui dipende il servizio in esecuzione. Utilizzare run per eseguire test o eseguire un'attività amministrativa come la rimozione o l'aggiunta di dati a un contenitore del volume di dati. Il runcomando agisce come docker run -tise apre un terminale interattivo al contenitore e restituisce uno stato di uscita corrispondente allo stato di uscita del processo nel contenitore.


1
Questa dovrebbe essere la risposta accettata. Fondamentalmente, utilizzare docker-compose runper eseguire comandi su un servizio in esecuzione e docker-compose upper generare un nuovo servizio.
goonerify
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.