web-dev-qa-db-fra.com

Comment obtenir docker-compose pour toujours recréer des conteneurs à partir d'images fraîches?

Les images de mon menu fixe sont construites sur un serveur Jenkins CI et sont transférées dans notre registre privé Docker. Mon objectif est de configurer 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 utilisions également des versions antérieures.

J'ai toujours utilisé les commandes docker-compose pull && docker-compose up -d pour récupérer les nouvelles images dans la base de registres et les démarrer. Je pense que mon comportement préféré fonctionnait comme prévu jusqu'à un certain moment, mais depuis lors, docker-compose up a commencé à réexécuter les conteneurs précédemment arrêtés au lieu de démarrer les images d'origine à chaque fois.

Y a-t-il un moyen de se débarrasser de ce comportement? Cela pourrait-il en être un 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 aussi en savoir un peu plus sur l'arrière-plan 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 tout simplement aller à l’encontre de cette approche .. ou est-ce que je manque quelques points ici?

149
Kristof Jozsa

docker-compose up --force-recreate est une option, mais si vous l'utilisez pour CI, je commencerais la construction avec docker-compose rm -f pour arrêter et supprimer les conteneurs et les volumes (puis la suivre avec pull et up).

C'est ce que j'utilise:

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

La raison pour laquelle les conteneurs sont recréés est de préserver tous les volumes de données qui pourraient être utilisés (et il arrive également que up soit beaucoup plus rapide).

Si vous faites du CI, vous ne le souhaitez pas, il vous suffit donc de tout supprimer pour obtenir ce que vous voulez.

Mise à jour: utilisez up --build qui a été ajouté dans docker-compose 1.7.

187
dnephin

La seule solution qui a fonctionné pour moi était cette commande:

docker-compose build --no-cache

Cela extraira automatiquement la nouvelle image du référentiel et n'utilisera pas la version de cache qui est pré-construite avec les paramètres que vous utilisiez auparavant.

99
davidbonachera

Selon le document officiel actuel documentation , un raccourci permet d'arrêter et de supprimer 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. aussi:

docker-compose down

Ensuite, si vous avez de nouvelles modifications sur vos images ou que Dockerfiles utilise:

docker-compose build --no-cache

Enfin: docker-compose up

Dans une commande: docker-compose down && docker-compose build --no-cache && docker-compose up

38
Victor Timoftii

Vous pouvez transmettre --force-recreate à docker compose up, qui doit utiliser des conteneurs neufs.

Je pense que la raison de la réutilisation des conteneurs est de préserver les modifications en cours de développement. Notez que Compose fait quelque chose de similaire avec les volumes, qui persisteront également entre les recréations de conteneurs (un conteneur recréé s'attachera aux volumes de son prédécesseur). Cela peut être utile, par exemple, si un conteneur Redis est utilisé en tant que 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 crois pas qu'il soit possible de forcer cela depuis le fichier Compose.

On peut soutenir que cela se heurte aux 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 de convenir que l’infra immuable est l’idée de base de Docker, bien que c’est certainement un bon argument de vente/cas d’utilisation.

15
Adrian Mouat