From 9ad626b36e3002e807dc0499692dc41aaab9e5e8 Mon Sep 17 00:00:00 2001 From: Connor Lanigan Date: Tue, 23 Nov 2021 06:15:59 +0100 Subject: [PATCH] fix(webhooks): support image names containing a port number (#4526) (#5970) This fixes a bug where image/registry names that contain a port number were inadvertently truncated (because port numbers are specified with a colon, just like the image tag). For example, updating an image named `registry.example.com:5000/myimage:oldtag` with the new image tag `newtag` was incorrectly transformed into `registry.example.com:newtag` --- api/http/handler/webhooks/webhook_execute.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/api/http/handler/webhooks/webhook_execute.go b/api/http/handler/webhooks/webhook_execute.go index 300b2a6dc..fb1cbdfbd 100644 --- a/api/http/handler/webhooks/webhook_execute.go +++ b/api/http/handler/webhooks/webhook_execute.go @@ -73,11 +73,17 @@ func (handler *Handler) executeServiceWebhook(w http.ResponseWriter, endpoint *p } service.Spec.TaskTemplate.ForceUpdate++ + + var imageName = strings.Split(service.Spec.TaskTemplate.ContainerSpec.Image, "@sha")[0] if imageTag != "" { - service.Spec.TaskTemplate.ContainerSpec.Image = strings.Split(service.Spec.TaskTemplate.ContainerSpec.Image, ":")[0] + ":" + imageTag + var tagIndex = strings.LastIndex(imageName, ":") + if tagIndex == -1 { + tagIndex = len(imageName) + } + service.Spec.TaskTemplate.ContainerSpec.Image = imageName[:tagIndex] + ":" + imageTag } else { - service.Spec.TaskTemplate.ContainerSpec.Image = strings.Split(service.Spec.TaskTemplate.ContainerSpec.Image, "@sha")[0] + service.Spec.TaskTemplate.ContainerSpec.Image = imageName } _, err = dockerClient.ServiceUpdate(context.Background(), resourceID, service.Version, service.Spec, dockertypes.ServiceUpdateOptions{QueryRegistry: true})