Come riavviare un singolo contenitore con docker-compose


333

Ho un docker-compose.ymlfile che contiene 4 contenitori: redis, postgres, api, worker

Durante lo sviluppo di lavoratore, spesso devo riavviarlo per applicare le modifiche. Esiste un buon modo per riavviare un contenitore (ad esempio worker) senza riavviare gli altri contenitori?


2
docker-compose -f docker-compose.yml riavvia lavoratore
Jinna Balu

Risposte:


398

È molto semplice: usa il comando:

docker-compose restart worker

Puoi impostare il tempo di attesa per l'arresto prima di uccidere il container (in secondi)

docker-compose restart -t 30 worker

Si noti che ciò riavvierà il contenitore ma senza ricostruirlo. Se desideri applicare le modifiche e riavviare, dai un'occhiata alle altre risposte.


3
per me ha funzionato, ma una domanda generale se consentita qui: il "riavvio" si occupa dei contenitori collegati e aggiorna / etc / hosts o un "riavvio" non modifica affatto alcun IP?
Michabbb,

I contenitori sono collegati per nome e in genere l'unico IP di cui devi preoccuparti è l'IP dell'host docker esterno (in genere 192.168.99.100). Dove possono esserci dei problemi è, ad esempio, il riavvio di un contenitore di database a cui sono collegati altri contenitori. I contenitori dipendenti dovranno essere sufficientemente resistenti per riconnettersi.
Ryan Kimber

20
L'OP afferma che deve "riavviarlo per applicare le modifiche". Secondo i documenti, i docker-compose restartcomandi NON applicheranno alcuna modifica. "Se si apportano modifiche alla docker-compose.ymlconfigurazione, queste modifiche non si riflettono dopo aver eseguito questo comando." Pertanto utilizzare docker-compose up -d --build. docs.docker.com/compose/reference/restart
featherbelly

5
nb, worker è il nome assegnato al servizio nel file yaml e non tutto ciò che si vede durante l'esecuzionedocker ps -a
worc,

2
Quest'altra risposta è molto meglio stackoverflow.com/a/39501539/292408 , in quanto restartnon si applicano modifiche anche se è già stata eseguita una docker-compose build <container name>e questa è una risposta non funzionante / errata.
Elijah Lynn

170

Le altre risposte a riavviare un singolo nodo sono sul bersaglio, docker-compose restart worker. Ciò farà rimbalzare quel contenitore, ma non includerà alcuna modifica, anche se lo ricostruirai separatamente. È possibile manualmente stop, rm, create, e start, ma ci sono metodi molto più facile.

Se hai aggiornato il codice, puoi creare e ricaricare in un solo passaggio con:

docker-compose up --detach --build

Ciò ricostruirà prima le immagini da qualsiasi codice modificato, il che è veloce se non ci sono modifiche poiché la cache viene riutilizzata. E quindi sostituisce solo i contenitori modificati. Se le immagini scaricate sono obsolete, puoi precedere il comando sopra con:

docker-compose pull

Per scaricare prima le immagini modificate (i contenitori non verranno riavviati fino a quando non si esegue un comando come upsopra). Fare una sosta iniziale non è necessario.

E per farlo solo per un singolo servizio, segui il comando up o pull con i servizi che vuoi specificare, ad es .:

docker-compose up --detach --build worker

Ecco un breve esempio della prima opzione, il Dockerfile è strutturato per mantenere le parti del codice che cambiano frequentemente verso la fine. In effetti i requisiti vengono inseriti separatamente per il pip installfatto che quel file cambia raramente. E poiché i contenitori nginx e redis erano aggiornati, non sono stati riavviati. Il tempo totale per l'intero processo è stato inferiore a 6 secondi:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s

Questo è interessante, ma potrebbe essere usato insieme -no-cacheall'opzione? Supponiamo di aver aggiunto qualcosa al mio package.jsone che sia necessario modificarlo, RUN npm installma lo Dockerfilestesso non è cambiato
Augustin Riedinger,

2
@augustinriedinger Se il file di input viene modificato e lo si include con un COPYcomando, la cache verrà automaticamente interrotta.
BMitch

1
@augustinriedinger grazie. Sono mobile, quindi non riesco a vedere le domande collegate. Dai passaggi della tua domanda dovresti già avere un COPYcomando nel tuo Dockerfile. Il git pullaggiornerà il file package.json e la cache di build si romperà quando finestra mobile vede si copia in un file diverso.
BMitch,

1
Grazie non sapevo di questo comportamento! Stavo usando ADDinvece di, COPYma a quanto pare quest'ultima è una buona pratica, quindi ci proverò!
Augustin Riedinger,

1
@augustinriedinger ADDavrà lo stesso risultato COPYdel busto della cache, ma (come suggerito nel link delle migliori pratiche) la maggior parte non ha bisogno delle funzionalità extra, quindi non mi preoccupo nemmeno di menzionarlo.
BMitch,

28

Per riavviare un servizio con le modifiche qui sono i passaggi che ho eseguito:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker

10
Se hai bisogno di modifiche da applicare con una build, puoi facilmente fare una docker-compose up -d --builde ricostruirà tutto e riavvierà i contenitori modificati. Non è necessario prima interrompere l'arresto, con tempi di inattività e comandi separati di creazione e avvio.
BMitch,

4
Sì, se si desidera riavviare tutti i servizi, ma l'OP vuole solo riavviare un singolo servizio e non riavviare gli altri
Jeff

3
Vedi la risposta che ho pubblicato, nell'esempio, upsarà solo ricreato il contenitore che era stato modificato e quindi necessitava di un riavvio.
BMitch,

18

A seguito del comando

docker-compose restart worker

si fermerà e avvierà il contenitore. cioè senza caricare alcuna modifica dal docker-compose.xml

STOP è simile al letargo nel PC. Quindi stop / start non cercherà alcuna modifica apportata al file di configurazione. Per ricaricare dalla ricetta del contenitore (docker-compose.xml) è necessario rimuovere e creare il contenitore (analogia simile al riavvio del PC)

Quindi i comandi saranno i seguenti

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

+1, molte grazie! L' rmopzione di linea -fè utile (nessun prompt) e con la finestra mobile corrente createe startviene unita come up(quindi in totale abbiamo 3 comandi non 4), e per l' upopzione -dè utile (l'esecuzione è in background).
astrowalker il

10

Riavvia il servizio con il file comporre docker

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

Usa il caso n. 1: se COMPOSE_FILE_NAME è docker-compose.ymle il servizio è funzionante

docker-compose restart worker

Usa il caso n. 2: se il nome del file è sample.ymle il servizio è worker

docker-compose -f sample.yml restart worker

Per impostazione predefinita, docker-compose cerca docker-compose.ymlse eseguiamo il docker-composecomando, altrimenti abbiamo flag con cui dare un nome file specifico-f [FILE_NAME].yml


7

Il semplice comando 'docker' non sa nulla del contenitore 'worker'. Usa il comando in questo modo

docker-compose -f docker-compose.yml restart worker


4
non funziona - nuove modifiche a coker-compose.yml non sono state applicate al riavvio
jlee

3

Riavvia contenitore

Se si desidera semplicemente riavviare il contenitore:

docker-compose restart servicename

Pensa a questo comando come "basta riavviare il contenitore con il suo nome", che equivale a docker restart comando.

Nota avvertenze:

  1. Se hai modificato le variabili ENV, queste non verranno aggiornate nel contenitore. Devi fermarlo e ricominciare. Oppure, usando il comando singolo docker-compose uprileverai le modifiche e ricreare il contenitore.

  2. Come molti altri hanno menzionato, se hai modificato il docker-compose.ymlfile stesso, il semplice riavvio non applicherà tali modifiche.

  3. Se copi il codice all'interno del contenitore in fase di compilazione (in Dockerfile nell'uso ADDo nei COPYcomandi), ogni volta che il codice cambia devi ricostruire il contenitore ( docker-compose build).

Correlazione al tuo codice

docker-compose restartdovrebbe funzionare perfettamente, se il tuo codice ottiene il percorso mappato nel contenitore dalla direttiva volume in questo docker-compose.ymlmodo:

services:

  servicename:
    volumes:
      - .:/code

Ma consiglierei di utilizzare il ricaricamento del codice in tempo reale, che è probabilmente fornito dal framework scelto in modalità DEBUG (in alternativa, è possibile cercare i pacchetti di ricaricamento automatico nella lingua scelta). L'aggiunta di questo dovrebbe eliminare la necessità di riavviare il contenitore ogni volta dopo la modifica del codice, invece di ricaricare il processo all'interno.


1

La risposta qui sta parlando del riflesso del cambiamento sul file docker-compose.yml.

E se volessi incorporare le modifiche che ho fatto nel mio codice e credo che sarà possibile solo ricostruendo l'immagine e che lo farò con i seguenti comandi

1. arresto del contenitore della finestra mobile

docker stop container-id

2. rimozione del contenitore docker

docker rm container-id

3. rimozione dell'immagine docker

docker rmi image-id

4. comporre nuovamente il contenitore

docker-compose up container-name
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.