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.
'docker-compose up -d --force-recreate' non ha funzionato? – BMitch
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
--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 –