web-dev-qa-db-fra.com

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

environnement

  • docker 1.12
  • clous sur Ubuntu 16.04

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.

36
longday

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
33
Aisamu

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

15
DevOps Dan

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

7
renskiy

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

3
Pratik

Ce que je fais c'est

  1. tirez 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

3
getvivekv