Service Docker Swarm-forcer la mise à jour de la dernière image déjà en cours d'exécution

Environnement

  • docker 1.12
  • clusted sur Ubuntu 16.04

Existe-t-il un moyen de forcer une mise à jour continue à un service Docker swarm déjà en cours d'exécution si la mise à jour du service ne modifie aucun paramètre mais que l'image du concentrateur docker a été mise à jour?

Exemple: j'ai déployé le service:

docker service create --replicas 1 --name servicename --publish 80:80 username/imagename:latest

Mon processus de construction a mis à jour la dernière image sur Docker hub maintenant, je veux tirer à nouveau la dernière.

J'ai essayé de courir:

docker service update --image username/imagename:latest servicename

Quand Je suivez ce processus, docker ne tire pas la dernière, je suppose que cela suppose que depuis que je voulais la dernière et docker a déjà tiré une image: latest alors il n'y a rien à faire.

Le seul travail que j'ai est de supprimer le service servicename et de le redéployer.

24
demandé sur longday 2016-08-14 00:20:17

4 réponses

Juste pour référence future:

Docker 1.13 ajouté un --force drapeau à service update:

--force: forcer la mise à jour même si aucune modification ne l'exige

Utilisez-le comme dans:

docker service update --force service_name
17
répondu Aisamu 2017-01-27 15:35:51

Docker n'effectuera pas automatiquement une extraction depuis dockerhub (ou registre privé) pour une image:tag que vous avez déjà localement.

Si vous effectuez une extraction manuelle avant le docker service update, ou supprimez l'image localement, ce serait le cas.

Vous pouvez également enchaîner la commande:

docker pull image:tag && docker service update --image username/imagename:latest servicename

Vous pouvez éviter ce scénario en étiquetant vos images numériquement et en utilisant une balise mise à jour. username/imagename:1.1.0

11
répondu DevOps Dan 2016-08-14 00:49:24

Vous pouvez utiliser l'ID d'image au lieu de username/imagename:latest comme ceci:

docker service update --image \
$(docker inspect --type image --format '{{.Id}}' username/imagename:latest) \
servicename

Mais dans ce cas, tous vos nœuds doivent extraire cette image avant la mise à jour du service. Sinon, les conteneurs seront mis à jour uniquement sur les nœuds où l'image avec un tel ID existe. Heureusement, les nœuds qui n'ont pas cette image arrêteront leurs conteneurs, donc il n'y a rien de mal si certains nœuds échouent à tirer une nouvelle version de l'image.

UPDATE : ou vous pouvez utiliser Image digest comme suivre:

docker service update --image \
$(docker inspect --type image --format '{{index .RepoDigests 0}}' username/imagename:latest) \
servicename

docker inspect --type image --format '{{index .RepoDigests 0}}' IMAGE renvoie image digest qui inclut le hachage unique de l'image générée par registry v2. Ainsi, l'image doit être tirée du registre, sinon digest ne sera pas disponible.

L'utilisation de digest vous permet de ne pas extraire d'images sur tous vos nœuds (les images avec digest spécifié seront automatiquement extraites du Registre sur les nœuds nécessaires). Mais vous devez extraire une nouvelle version de l'image Une fois sur un nœud de gestionnaire avant la mise à jour du service.

BTW, dernière façon sera par défaut depuis le Panneau 1.13

7
répondu renskiy 2016-11-20 21:09:47

Ce que je fais est

  1. Tirez l'image en premier
  2. Exécutez la commande update avec la nouvelle étiquette d'horodatage

Mise à jour du service Docker --container-label-add last_deployed=$(date-u +%Y- % m - % dT%H: % M:%S) service_name_or_id

3
répondu getvivekv 2018-05-16 15:32:42