environnement
Existe-t-il un moyen de forcer une mise à jour progressive à un service Docker Swarm déjà en cours d'exécution si la mise à jour de service ne modifie aucun paramètre mais que l'image de concentrateur de 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 le docker hub. Je souhaite maintenant extraire la dernière.
J'ai essayé de courir:
docker service update --image username/imagename:latest servicename
Quand je suis ce processus, docker ne tire pas le dernier en date, je suppose qu'il suppose que puisque je voulais dernier et que le docker a déjà tiré une image: en dernier alors il n'y a rien à faire.
Le seul travail que je puisse faire est de supprimer le service nom de service et de le redéployer.
Juste pour référence future:
Docker 1.13 a ajouté un --force
drapeau à service update
:
--force
: Force la mise à jour même si aucune modification ne l'exige
Utilisez-le comme dans:
docker service update --force service_name
Docker n'effectue pas automatiquement l'extraction à partir de DockerHub (ou d'un registre privé) pour une image: une balise que vous avez déjà localement.
Si vous avez effectué un tirage manuel avant le docker service update
, ou supprimé localement de l'image, ce serait.
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 balisant numériquement vos images et en utilisant une balise mise à jour. username/imagename:1.1.0
Vous pouvez utiliser l'ID d'image au lieu de username/imagename:latest
comme ça:
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 ne seront mis à jour que sur les nœuds où une image avec un tel ID existe. Heureusement, les nœuds qui n'ont pas cette image arrêteront leurs conteneurs, il n'y a donc rien de grave si certains nœuds ne parviennent pas à extraire la nouvelle version de l'image.
[~ # ~] update [~ # ~] : ou vous pouvez utiliser le résumé de l'image comme suit:
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 le résumé de l'image, qui comprend un hachage unique de l'image générée par Registry v2. Ainsi, l'image doit être extraite 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 un résumé spécifié seront automatiquement extraites du registre sur les nœuds nécessaires). Mais vous devez extraire la nouvelle version de l'image une fois sur un nœud de gestionnaire avant la mise à jour du service.
BTW, la dernière manière sera la valeur par défaut depuis Docker 1.1
Si vous souhaitez mettre à jour l'image du service Docker, vous pouvez simplement faire docker service update --image myimage:tag servicename
. par exemple. docker service update --image traefik:1.7.5 traefik_proxy
Aussi en n'utilisant pas myimage:latest
balise, elle permet de ne pas mettre à jour involontairement la dernière mise à jour majeure/mineure au lieu de la version du correctif.
Réf.: https://github.com/moby/moby/issues/30951#issuecomment-279479589
Ce que je fais c'est
mise à jour du service docker --container-label-add last_deployed = $ (date -u +% Y-% m-% dT% H:% M:% S) nom_service_ou_id