Come ottenere docker-compose per ricreare sempre i contenitori da nuove immagini?


199

Le mie immagini docker sono costruite su un server CI Jenkins e vengono inviate al nostro registro Docker privato. Il mio obiettivo è il provisioning di ambienti con docker-compose che avviino sempre lo stato originale delle immagini.

Attualmente sto usando docker-compose 1.3.2 e 1.4.0 su macchine diverse, ma abbiamo anche usato versioni precedenti.

Ho sempre usato i docker-compose pull && docker-compose up -dcomandi per recuperare le nuove immagini dal registro e avviarle. Credo che il mio comportamento preferito funzionasse come previsto fino a un certo punto nel tempo, ma da allora ha docker-compose upiniziato a rieseguire container precedentemente arrestati invece di avviare ogni volta le immagini originariamente costruite.

C'è un modo per sbarazzarsi di questo comportamento? In questo modo potrebbe essere uno che è cablato nel file di configurazione docker-compose.yml per non dipendere dal "non dimenticare" qualcosa sulla riga di comando ad ogni chiamata?

ps. Oltre a trovare un modo per raggiungere il mio obiettivo, mi piacerebbe anche sapere qualcosa in più sullo sfondo di questo comportamento. Penso che l'idea di base di Docker sia quella di costruire un'infrastruttura immutabile. L'attuale comportamento di docker-compose sembra semplicemente scontrarsi con questo approccio .. o mi manca qualche punto qui?

Risposte:


233

docker-compose up --force-recreateè un'opzione, ma se lo stai usando per CI, inizierei la compilazione docker-compose rm -fper arrestare e rimuovere i contenitori e i volumi (quindi seguirlo con pull e up).

Questo è quello che uso:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

Il motivo per cui i contenitori vengono ricreati è quello di preservare tutti i volumi di dati che potrebbero essere utilizzati (e può anche essere upmolto più veloce).

Se stai facendo CI non lo vuoi, quindi basta rimuovere tutto dovrebbe farti desiderare che desideri.

Aggiornamento: uso up --buildche è stato aggiunto in docker-compose1.7


1
Sì, in realtà questo è quello che faccio anche in CI. Non so perché non ne abbia parlato ...
Adrian Mouat,

@dnephin docker-compose run -dnon esiste? Vuoi dire di docker-compose up -dno?
Guillaume Vincent

2
se corri docker-compose pullprima docker-compose rm -fpuoi risparmiare ancora più tempo
stephanlindauer,

2
Cosa fa la bandiera -d alla fine?
David J. Davis,

3
"-d Modalità indipendente: esegui contenitori in background"
dnephin

135

L'unica soluzione che ha funzionato per me era questo comando:

docker-compose build --no-cache

Ciò estrarrà automaticamente nuova immagine dal repository e non utilizzerà la versione cache pre-compilata con tutti i parametri che hai utilizzato in precedenza.


1
Inoltre, in Windows 10 può essere utile impostare il server DNS nelle impostazioni da Automatico a Fisso o da Fisso a Automatico.
qräbnö,

2
Ha funzionato per me su OS X building con docker-comopse versione 2.
RoboBear,

1
Ha funzionato sulla finestra mobile di OS X.
HelloWorld,

55

Con l'attuale documentazione ufficiale esiste una scorciatoia che interrompe e rimuove container, reti, volumi e immagini creati da up, se sono già stati arrestati o parzialmente rimossi e così via, allora farà anche il trucco:

docker-compose down

Quindi se hai nuove modifiche alle tue immagini o Dockerfile usa:

docker-compose build --no-cache

Finalmente:docker-compose up

In un comando: docker-compose down && docker-compose build --no-cache && docker-compose up


2
docker-compose build --no-cacheè necessario solo se sono presenti modifiche su Dockerfile.
Victor Timoftii,

Anzi, Victor. Grazie! Ho pensato che fosse necessario anche dopo l'aggiornamento di un modulo / applicazione che viene eseguita all'avvio del contenitore. Per questi casi, prima di eseguire docker-compose up, è necessario ricostruire i servizi con docker-compose build.
Ivanleoncz,

18

Puoi passare --force-recreatea docker compose up, che dovrebbe usare contenitori nuovi.

Penso che il ragionamento alla base del riutilizzo dei contenitori sia quello di preservare eventuali cambiamenti durante lo sviluppo. Si noti che Compose fa qualcosa di simile con i volumi, che persisterà anche tra la ricreazione del contenitore (un contenitore ricreato si collegherà ai volumi del suo predecessore). Questo può essere utile, ad esempio, se hai un contenitore Redis usato come cache e non vuoi perdere la cache ogni volta che apporti una piccola modifica. Altre volte è solo confuso.

Non credo che ci sia alcun modo per forzarlo dal file Compose.

Probabilmente si scontra con principi di infrastruttura immutabili. Il contro-argomento è probabilmente che non usi Compose in produzione (ancora). Inoltre, non sono sicuro di essere d'accordo sul fatto che l'infrazione immutabile sia l'idea di base di Docker, sebbene sia certamente un buon caso d'uso / punto di vendita.


Grazie per la risposta. Penso che sarebbe davvero utile forzarlo a livello di configurazione, ad es. per applicarlo per un contenitore di database e disabilitare la ricreazione per impostazione predefinita per i contenitori di app.
Kristof Jozsa,

8
--force-recreatenon funziona per me ... L'immagine non viene estratta anche se è disponibile una versione più recente ...
lisak

1
@lisak Non ho mai detto che ha tirato nuove immagini. Non Avvia appena nuovi contenitori utilizzando qualsiasi immagine disponibile localmente. Dovrai eseguire la finestra mobile pull manualmente.
Adrian Mouat,

2
docker-compose up --build

O

docker-compose build --no-cache

1
Quando possibile, fare uno sforzo per fornire ulteriori spiegazioni anziché solo codice. Tali risposte tendono ad essere più utili in quanto aiutano i membri della comunità e soprattutto i nuovi sviluppatori a comprendere meglio il ragionamento della soluzione e possono aiutare a prevenire la necessità di rispondere a domande di follow-up.
Rajan

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.