2016-06-07 23 views
16

Non so cosa sto facendo male, ma semplicemente non riesco a ottenere docker-compose up per usare l'ultima immagine dal nostro registro senza prima rimuovere i vecchi contenitori dal sistema completamente. Sembra che la composizione stia usando l'immagine avviata in precedenza anche se la funzione di composizione di una finestra mobile ha recuperato un'immagine più recente.come ottenere docker-compose per utilizzare l'ultima immagine dal repository

Ho guardato a How to get docker-compose to always re-create containers from fresh images? che sembrava essere simile al mio problema, ma nessuna delle soluzioni fornite lì funziona per me, dal momento che sto cercando una soluzione che posso usare sul server di produzione e lì non voglio rimuovere tutti i contenitori prima di riavviarli (possibile perdita di dati?). Vorrei comporre solo per rilevare la nuova versione delle immagini modificate, trascinarle e quindi riavviare i servizi con quelle nuove immagini.

Ho creato per questo un semplice progetto di test in cui l'unico obiettivo è ottenere una versione nr da aumentare su ogni nuova build. La versione nr viene visualizzata se sfoglio il server nginx che viene creato (funziona come previsto a livello locale).

finestra mobile Versione: 1.11.2 versione finestra mobile-composizione: 1.7.1 OS: testato su entrambi CentOS 7 e OS X utilizzando 10.10 finestra mobile-toolbox

mia finestra mobile-compose.yml:

version: '2' 
services: 
    application: 
    image: ourprivate.docker.reg:5000/ourcompany/buildchaintest:0.1.8-dev 
    volumes: 
     - /var/www/html 
    tty: true 

    nginx: 
    build: nginx 
    ports: 
     - "80:80" 
    volumes_from: 
     - application 
    volumes: 
     - ./logs/nginx/:/var/log/nginx 
    php: 
    container_name: buildchaintest_php_1 
    build: php-fpm 
    expose: 
     - "9000" 
    volumes_from: 
     - application 
    volumes: 
     - ./logs/php-fpm/:/var/www/logs 

sul nostro server Jenkins ho eseguire il seguente per costruire e contrassegnare l'immagine

cd $WORKSPACE && PROJECT_VERSION=$(cat VERSION)-dev 
/usr/local/bin/docker-compose rm -f 
/usr/local/bin/docker-compose build 
docker tag ourprivate.docker.reg:5000/ourcompany/buildchaintest ourprivate.docker.reg:5000/ourcompany/buildchaintest:$PROJECT_VERSION 
docker push ourprivate.docker.reg:5000/ourcompany/buildchaintest 

questo sembra stia facendo quello che si suppone di essere da quando ho ge t un nuovo tag di versione nel nostro repository ogni volta che la compilazione termina e la versione nr è stata urtata.

Se ora corro

docker-compose pull && docker-compose -f docker-compose.yml up -d 

in una cartella sul mio computer, in cui il contenuto è solo la finestra mobile-compose.yml ei Dockerfiles necessari per costruire i servizi nginx e php, l'uscita ottengo è non l'ultimo numero di versione come è stato taggato nel registro o è mostrato in docker-compose.yml (0.1.8), ma la versione precedente, che è 0.1.7. Tuttavia l'output del comando trazione suggerirebbe che una nuova versione dell'immagine era inverosimile:

Pulling application (ourprivate.docker.reg:5000/ourcompany/buildchaintest:latest)... 
latest: Pulling from ourcompany/buildchaintest 
Digest: sha256:8f7a06203005ff932799fe89e7756cd21719cccb9099b7898af2399414bfe62a 
Status: Downloaded newer image for docker.locotech.fi:5000/locotech/buildchaintest:0.1.8-dev 

Solo se corro

docker-compose stop && docker-compose rm -f 

e quindi eseguire il comando docker-compose up faccio ad avere la nuova versione di apparire sullo schermo come previsto.

È questo comportamento previsto di docker-compose? Devo sempre fare un docker-compose rm -f prima di eseguire nuovamente up, anche sui server di produzione? O sto facendo qualcosa contro il grano qui, che è il motivo per cui non funziona?

L'obiettivo è di creare il processo di generazione e creare versioni con tag delle immagini necessarie in un docker-compose.yml, inviarle al nostro registro privato e quindi per il "rilascio in fase di produzione" per copiare semplicemente il docker-compose.yml al server di produzione ed eseguire un docker-compose pull && docker-compose -f docker-compose.yml up -d per l'avvio della nuova immagine in produzione. Se qualcuno ha suggerimenti su questo o può indicare un tutorial di buone pratiche per questo tipo di installazione che sarebbe molto apprezzato anche.

+0

'docker-compose up -d --force-recreate' non ha funzionato? – BMitch

+0

Per evitare il rischio di perdita di dati durante la rimozione/creazione di contenitori, utilizzare un host o un volume denominato. Sembra che tu stia già utilizzando i volumi host per gli altri contenitori. Un volume con nome vuoto verrà inizializzato con i contenuti del volume dell'immagine al primo utilizzo. – BMitch

+0

--force-ricreato non ha funzionato, no :(Sto usando i volumi per l'archiviazione dei dati, quindi la parte di perdita dei dati non è forse rilevante, ma sono ancora confuso riguardo alla necessità di eseguire una finestra mobile-comporre prima di riavviare i contenitori, non dovrebbe il comando up, specialmente con force-recreate, occuparsi di notificare una nuova immagine e usarlo invece? È sbagliato che dovrei forzare una rimozione su un server di produzione –

risposta

8

Per chiudere questa domanda, quella che sembrava aver funzionato è infatti in esecuzione

docker-compose stop 
docker-compose rm -f 
docker-compose -f docker-compose.yml up -d 

Vale a dire rimuovere i contenitori prima di eseguire nuovamente up.

Quello che si deve tenere a mente quando si fa in questo modo è che anche i contenitori del volume di dati vengono rimossi se si esegue semplicemente rm -f. Al fine di evitare che specificare esplicitamente ogni contenitore per rimuovere:

docker-compose rm -f application nginx php 

Come ho detto nella mia interrogazione, non so se questo è il processo corretto. Ma questo sembra funzionare per il nostro caso d'uso, quindi finché non troveremo una soluzione migliore, utilizzeremo questa soluzione.

+0

Cosa fare se si desidera eseguire il rollback alla versione precedente del contenitore? Risciacquare, ripetere? – EightyEight

+1

Non l'ho provato ma sì, presumo altrettanto. Poiché la versione del contenitore deve essere definita nel docker-compose.yml (ad es. Myimage: 2.0.1) se si desidera eseguire il rollback, aggiornare la docker-compose.yml alla versione a cui si desidera eseguire il rollback (ad es. 2.0 .0) e ripetere la stessa procedura di risciacquo. –

+0

se voglio eseguire il rollback, ho appena ripristinato il commit, l'hub docker è stato compilato e quindi aspettato che l'updater lo raccolga. probabilmente non è il sistema più elaborato ma funziona per i miei progetti di tempo libero. – stephanlindauer

8

per assicurarsi che si stia utilizzando la versione più recente per il tag :latest dal registro (ad esempio hub di docker), è necessario anche estrarre di nuovo l'ultimo tag. nel caso sia cambiato, il diff sarà scaricato e avviato quando si docker-compose up di nuovo.

quindi questa sarebbe la strada da percorrere:

docker-compose stop 
docker-compose rm -f 
docker-compose pull 
docker-compose up -d 

ho incollato questo in un'immagine che ho eseguito per iniziare finestra mobile-composizione e assicurarsi che le immagini rimanere up-to-date: https://hub.docker.com/r/stephanlindauer/docker-compose-updater/

2

Ho visto questo si verifica nel nostro sistema di produzione di docker 7-8. Un'altra soluzione che ha funzionato per me in produzione è stata di correre

docker-compose down 
docker-compose up -d 

questo rimuove i contenitori e sembra rendere 'up' creare nuovi da l'ultima immagine.

Questo non risolve il mio sogno di down + up per OGNI contenitore modificato (in serie, meno tempi di inattività), ma funziona per forzare "su" per aggiornare i contenitori.

+0

'docker-compose down' afaik rimuove anche tutti i contenitori del volume di dati collegati ai contenitori in esecuzione. Quindi nessun problema se i volumi di dati contengono solo cose che possono essere ricreate da un contenitore in esecuzione. Ma dovresti fare attenzione se i volumi contengono dati che desideri conservare. –

-1

La documentazione finestra mobile-composizione per il comando 'up' afferma chiaramente che aggiorna il contenitore deve l'immagine essere cambiato dopo l'ultima 'up' è stata eseguita:

Se ci sono contenitori esistenti per un servizio, e la configurazione o l'immagine del servizio è stata modificata dopo la creazione del contenitore, finestra mobile-compose up preleva le modifiche arrestando e ricreando i contenitori (mantenendo i volumi montati).

Quindi, utilizzando "stop" seguito da "pull" e quindi "su", si dovrebbe pertanto evitare problemi di volumi persi per i contenitori in esecuzione, ad eccezione ovviamente dei contenitori le cui immagini sono state aggiornate.

Attualmente sto sperimentando questo processo e includerò i miei risultati in questo commento a breve.

1

per ottenere le ultime immagini utilizzano finestra mobile-composizione costruire --pull

Io uso al di sotto di comando che è davvero 3 in 1

"docker-compose down && docker-compose build --pull && docker-compose up -d" 

Questo comando arrestare i servizi, tirare l'ultimo immagine e quindi avviare i servizi.

Problemi correlati