55 votes

Docker Swarm Service - 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

Est-il un moyen pour forcer une mise à jour propagée à un docker essaim de service déjà en cours d'exécution si le service de mise à jour n'est pas de changer tous les paramètres, mais le docker hub image a été mis à jour?

Exemple: j'ai déployé 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 la dernière fois.

J'ai essayé de lancer:

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

Lorsque j'ai suivi ce processus, docker ne tirez pas la dernière, je suppose qu'il suppose que depuis que j'ai voulu dernière et docker déjà tiré une image:plus tard puis il n'y a rien à faire.

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

66voto

Aisamu Points 400

Juste pour référence future:

Docker 1,13 a 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
 

26voto

DevOps Dan Points 933

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 chaîner la commande:

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

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

11voto

renskiy Points 828

Vous pourriez utiliser l'ID de l'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 les nœuds doivent tirer de cette image avant la mise en service de mise à jour. Sinon, les conteneurs seront mis à jour uniquement sur les nœuds où l'image avec un tel code existe. Heureusement, les nœuds qui n'ont pas cette image va arrêter de leurs contenants, donc il n'y a rien de mal si certains nœuds ne parviennent pas à tirer la nouvelle version de l'image.

Mise à JOUR: ou vous pouvez utiliser l'image digérer 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 l'image de digérer ce qui inclut unique de hachage de l'image générée par le registre v2. Ainsi, l'image doit être tiré à partir du registre, sinon digérer ne sera pas disponible.

À l'aide de digérer de vous permettre de vous ne tirez pas les images sur l'ensemble de vos nœuds (images spécifié digérer sera automatiquement retiré de registre sur les nœuds). Mais vous devez tirer des frais de version de l'image une fois sur un nœud gestionnaire avant la mise en service de mise à jour.

BTW, le dernier point sera par défaut depuis le Panneau de 1,13

6voto

cpxPratik Points 97

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 En n'utilisant pas la balise myimage:latest , cela garantit que vous ne mettrez pas à jour involontairement vers la dernière version majeure / mineure mise à jour au lieu de la version du correctif.

Réf: https://github.com/moby/moby/issues/30951#issuecomment-279479589

3voto

getvivekv Points 838

Ce que je fais c'est

  1. tirer d'abord l'image
  2. Exécutez la commande de mise à jour avec la nouvelle étiquette d'horodatage

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X