diff --git a/client/container_rename.go b/client/container_rename.go index 6ce1500080..7c6d515b39 100644 --- a/client/container_rename.go +++ b/client/container_rename.go @@ -3,6 +3,9 @@ package client import ( "context" "net/url" + "strings" + + "github.com/containerd/errdefs" ) // ContainerRenameOptions represents the options for renaming a container. @@ -21,6 +24,12 @@ func (cli *Client) ContainerRename(ctx context.Context, containerID string, opti if err != nil { return ContainerRenameResult{}, err } + options.NewName = strings.TrimSpace(options.NewName) + if options.NewName == "" || strings.TrimPrefix(options.NewName, "/") == "" { + // daemons before v29.0 did not handle the canonical name ("/") well + // let's be nice and validate it here before sending + return ContainerRenameResult{}, errdefs.ErrInvalidArgument.WithMessage("new name cannot be blank") + } query := url.Values{} query.Set("name", options.NewName) diff --git a/daemon/rename.go b/daemon/rename.go index b724fb698f..a06b7b8cca 100644 --- a/daemon/rename.go +++ b/daemon/rename.go @@ -18,7 +18,9 @@ import ( // to find the container. An error is returned if newName is already // reserved. func (daemon *Daemon) ContainerRename(oldName, newName string) (retErr error) { - if oldName == "" || newName == "" { + oldName = strings.TrimSpace(oldName) + newName = strings.TrimSpace(newName) + if strings.TrimPrefix(oldName, "/") == "" || strings.TrimPrefix(newName, "/") == "" { return errdefs.InvalidParameter(errors.New("Neither old nor new names may be empty")) } diff --git a/vendor/github.com/moby/moby/client/container_rename.go b/vendor/github.com/moby/moby/client/container_rename.go index 6ce1500080..7c6d515b39 100644 --- a/vendor/github.com/moby/moby/client/container_rename.go +++ b/vendor/github.com/moby/moby/client/container_rename.go @@ -3,6 +3,9 @@ package client import ( "context" "net/url" + "strings" + + "github.com/containerd/errdefs" ) // ContainerRenameOptions represents the options for renaming a container. @@ -21,6 +24,12 @@ func (cli *Client) ContainerRename(ctx context.Context, containerID string, opti if err != nil { return ContainerRenameResult{}, err } + options.NewName = strings.TrimSpace(options.NewName) + if options.NewName == "" || strings.TrimPrefix(options.NewName, "/") == "" { + // daemons before v29.0 did not handle the canonical name ("/") well + // let's be nice and validate it here before sending + return ContainerRenameResult{}, errdefs.ErrInvalidArgument.WithMessage("new name cannot be blank") + } query := url.Values{} query.Set("name", options.NewName)