Mes images Docker sont construites sur un serveur Jenkins CI et sont transférées vers notre registre Docker privé. Mon objectif est de fournir des environnements avec docker-compose qui démarrent toujours l'état d'origine des images.
J'utilise actuellement docker-compose 1.3.2 ainsi que 1.4.0 sur différentes machines, mais nous avons également utilisé des versions plus anciennes précédemment.
J'ai toujours utilisé les docker-compose pull && docker-compose up -d
commandes pour récupérer les nouvelles images du registre et les démarrer. Je crois que mon comportement préféré fonctionnait comme prévu jusqu'à un certain moment, mais depuis lors, a docker-compose up
commencé à réexécuter les conteneurs précédemment arrêtés au lieu de démarrer à chaque fois les images initialement créées.
Existe-t-il un moyen de se débarrasser de ce comportement? Est-ce que cela pourrait être celui qui est câblé dans le fichier de configuration docker-compose.yml pour ne pas dépendre de "ne pas oublier" quelque chose sur la ligne de commande à chaque appel?
ps. En plus de trouver un moyen d'atteindre mon objectif, j'aimerais également en savoir un peu plus sur le contexte de ce comportement. Je pense que l'idée de base de Docker est de construire une infrastructure immuable. Le comportement actuel de docker-compose semble simplement en contradiction avec cette approche .. ou est-ce que je manque quelques points ici?
la source
docker-compose run -d
n'existe pas? Tu veux diredocker-compose up -d
non?docker-compose pull
avant,docker-compose rm -f
vous pouvez gagner encore plus de tempsLa seule solution qui a fonctionné pour moi était cette commande:
Cela extraira automatiquement une nouvelle image du référentiel et n'utilisera pas la version du cache qui est préconstruite avec les paramètres que vous avez utilisés auparavant.
la source
Selon la documentation officielle actuelle , il existe un raccourci qui arrête et supprime les conteneurs, les réseaux, les volumes et les images créés par up, s'ils sont déjà arrêtés ou partiellement supprimés, etc., il fera également l'affaire:
Ensuite, si vous avez de nouvelles modifications sur vos images ou Dockerfiles, utilisez:
Finalement:
docker-compose up
En une seule commande:
docker-compose down && docker-compose build --no-cache && docker-compose up
la source
docker-compose build --no-cache
n'est nécessaire que s'il y a des changements sur Dockerfiles.docker-compose up
, il est nécessaire de reconstruire les services avecdocker-compose build
.Vous pouvez passer
--force-recreate
àdocker compose up
, qui devrait utiliser des conteneurs frais.Je pense que le raisonnement derrière la réutilisation des conteneurs est de conserver tout changement pendant le développement. Notez que Compose fait quelque chose de similaire avec les volumes, qui persisteront également entre les récréations de conteneurs (un conteneur recréé sera attaché aux volumes de son prédécesseur). Cela peut être utile, par exemple, si vous avez un conteneur Redis utilisé comme cache et que vous ne voulez pas perdre le cache chaque fois que vous effectuez une petite modification. À d'autres moments, c'est juste déroutant.
Je ne pense pas que vous puissiez forcer cela à partir du fichier Compose.
Il est possible que cela entre en conflit avec les principes d'infrastructure immuables. Le contre-argument est probablement que vous n'utilisez pas (encore) Compose en production. De plus, je ne suis pas sûr d'être d'accord sur le fait que l'infra immuable est l'idée de base de Docker, bien que ce soit certainement un bon cas d'utilisation / argument de vente.
la source
--force-recreate
ne fonctionne pas pour moi ... L'image n'est pas tirée même si une nouvelle version est disponible ...OU
la source
S'il y a quelque chose de nouveau, il sera reconstruit.
la source