2015-04-13 20 views
25

Quando inizialmente gestiscono un contenitore Docker da un'immagine è possibile specificare l'opzione:Come riavviare un container Docker esistente in restart = "always" mode?

--restart="always" 

Questo assicura che il contenitore è sempre riavviato dal demone Docker se per qualche motivo non si ferma. Così si potrebbe correre un contenitore in questo modo:

docker run --restart="always" <IMAGE> 

Inoltre è possibile riavviare un contenitore Docker esistente specificando il suo ID contenitore, vale a dire:

docker start <CONTAINER ID> 

Tuttavia non posso determinare se è possibile cambiare un contenitore esistente, che originariamente non era stato eseguito con l'opzione --restart="always, per convertirlo in riavvio sempre in futuro.

Attualmente l'unico modo che posso pensare di fare ciò è di salvare il contenitore come una nuova immagine e quindi eseguire quell'immagine come un nuovo contenitore con l'opzione --restart="always". Questo sarebbe in effetti il ​​modo corretto di farlo?

EDIT: Ciò che forse non ho reso abbastanza chiaro in origine è che sto pensando alla situazione in cui sono stati apportati cambiamenti nel contenitore da quando è stato eseguito originariamente, che devono essere mantenuti. Quindi, eseguire un nuovo contenitore dall'immagine originale non sarebbe sufficiente.

risposta

13

approvazione, in modo da rispondere alla mia domanda, sembra che non è possibile solo per riavviare lo stesso contenitore con --restart=always, perché è qualcosa che si deve fare quando si corsa un contenitore per la prima volta e non un parametro che è possibile utilizzare quando si si avvia un contenitore esistente.

ci sono tre possibili work-around a questo:

  1. Come @ user2915097 affermato, è possibile abbandonare il contenitore originale (l'arresto e poi eliminarlo con docker rm <CONTAINER ID> di rimettere in ordine). Quindi esegui un nuovo contenitore dall'immagine originale specificando l'opzione -restart=always questa volta.
  2. Se non sono stati utilizzati volumi, quindi le modifiche sono interne al contenitore, è necessario caricare il contenitore in una nuova immagine e quindi eseguire un nuovo contenitore da tale immagine.

    docker commit <CONTAINER ID> <NEW IMAGE NAME>

    docker run -d --restart=always ... <NEW IMAGE NAME>

  3. Se i volumi sono stati utilizzati e tutte le modifiche sono limitate ai volumi, allora si può eseguire un secondo contenitore con il parametro --volumes-from senza doversi impegnare una nuova versione dell'immagine. cioè

    • docker stop <CONTAINER 1 NAME>
    • docker run -d --restart=always --volumes-from <CONTAINER 1 NAME> ... <ORIGINAL IMAGE NAME>

    Sarebbe quindi sicuro per eliminare contenitore 1, in quanto i volumi non verranno eliminati, mentre un altro contenitore continua ad usarli.

Suppongo che ci sia anche una quarta possibilità; se hai usato un volume (s) e sai che ci sono state modifiche al contenitore che non sono nel volume, allora dovrai usare una combinazione di (2) e (3).

0

estratto http://www.brandpending.com/blog/2014/11/21/setting-and-re-setting-the-restart-behaviour-of-a-docker-container

Quindi diciamo che si desidera modificare il criterio di riavvio di questo contenitore da sempre on-fallimento. Per fare ciò, è necessario interrompere il contenitore, rimuoverlo ed eseguirlo nuovamente con la nuova politica di riavvio.

+0

Ma il problema con questo è perdere tutte le modifiche nel contenitore originale perché lo hai eliminato e ne hai creato uno nuovo da zero. Sono abbastanza sicuro che commettere una nuova immagine ed eseguire un nuovo contenitore da quella sarebbe meglio, se ci sono state delle modifiche nel contenitore originale che devono essere mantenute. –

+0

Quindi torniamo al commit – user2915097

+0

@rdc dovresti cercare di evitare di avere modifiche nei contenitori a causa di cose come questa - tenerlo in un volume o in un DB di qualche tipo. –

3

Aggiornamento: ha funzionato per abilitare il riavvio. Ma impostandolo su no, viene ripristinato su sempre e il contenitore si riavvia! :(ho intenzione di lasciare questa risposta qui in caso qualcuno capisce come questo funziona davvero. Devo essere vicino!

Gente, ho trovato la soluzione più hacky che ottiene intorno contenitori copiatura ecc

vi/var/lib/finestra mobile/contenitori/$ (finestra mobile ispezionare -f '{{.ID}}' $ ContainerID) /hostconfig.json

Cerca "RestartPolicy". Impostarlo "no", "sempre" ecc.

Forse qualcuno potrebbe avvolgere quello in una sceneggiatura !?

In ogni caso, quel pezzo di json insieme a config.json ti consentirebbe di modificare tutti i tipi di cose che ti sei perso durante la creazione del contenitore.

+0

Una parola di avvertimento a chiunque lo provi, Un sacco di gestione dello stato di Docker opera con l'assunto che è l'unica cosa che modifica il contenuto di/var/lib/docker . Stai molto attento quando apporti dei cambiamenti qui. –

+1

Ah sì, dipende da quali modifiche vengono apportate e quali file vengono mantenuti aperti.Per essere sicuri, non interrompere il motore di docker. Spero che aggiungano la possibilità di apportare modifiche nelle versioni successive. È pazzesco non avere l'abilità di manipolare il criterio di riavvio. – Matt

+1

Una nuova funzione set può essere aggiunta a breve. https://github.com/docker/docker/pull/15078 – Matt

54

Ora abbiamo la finestra mobile update, che consente di modificare la politica di riavvio di un contenitore in esecuzione.

docker update --restart=always <CONTAINER ID> 

Non ci sono altre tre opzioni:

  • no (default)
  • on-failure
  • meno-smesso

prega di fare riferimento alla link per i dettagli.

+0

In quale versione di Docker è stata introdotta? –

+2

È disponibile dalla versione 1.11.0. –

Problemi correlati