2020-06-18 16:13:24 +02:00
|
|
|
/*
|
|
|
|
Copyright 2020 Docker, Inc.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2020-05-10 22:37:28 +02:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
2020-05-14 20:58:14 +02:00
|
|
|
"context"
|
2020-05-13 09:00:48 +02:00
|
|
|
"fmt"
|
2020-08-05 11:31:42 +02:00
|
|
|
"strings"
|
2020-05-10 22:37:28 +02:00
|
|
|
|
2020-08-05 11:31:42 +02:00
|
|
|
"github.com/hashicorp/go-multierror"
|
2020-05-10 22:37:28 +02:00
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
|
2020-08-21 17:24:53 +02:00
|
|
|
"github.com/docker/compose-cli/client"
|
|
|
|
"github.com/docker/compose-cli/containers"
|
|
|
|
"github.com/docker/compose-cli/errdefs"
|
2020-05-10 22:37:28 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
type rmOpts struct {
|
|
|
|
force bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// RmCommand deletes containers
|
|
|
|
func RmCommand() *cobra.Command {
|
|
|
|
var opts rmOpts
|
|
|
|
cmd := &cobra.Command{
|
2020-09-04 13:12:54 +02:00
|
|
|
Use: "rm",
|
|
|
|
Short: "Remove containers",
|
|
|
|
Args: cobra.MinimumNArgs(1),
|
2020-05-10 22:37:28 +02:00
|
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
2020-05-14 20:58:14 +02:00
|
|
|
return runRm(cmd.Context(), args, opts)
|
2020-05-10 22:37:28 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
cmd.Flags().BoolVarP(&opts.force, "force", "f", false, "Force removal")
|
|
|
|
|
|
|
|
return cmd
|
|
|
|
}
|
2020-05-14 20:58:14 +02:00
|
|
|
|
|
|
|
func runRm(ctx context.Context, args []string, opts rmOpts) error {
|
|
|
|
c, err := client.New(ctx)
|
|
|
|
if err != nil {
|
|
|
|
return errors.Wrap(err, "cannot connect to backend")
|
|
|
|
}
|
|
|
|
|
|
|
|
var errs *multierror.Error
|
|
|
|
for _, id := range args {
|
2020-08-11 15:46:29 +02:00
|
|
|
err := c.ContainerService().Delete(ctx, id, containers.DeleteRequest{
|
|
|
|
Force: opts.force,
|
|
|
|
})
|
2020-05-14 20:58:14 +02:00
|
|
|
if err != nil {
|
2020-08-11 15:46:29 +02:00
|
|
|
if errdefs.IsForbiddenError(err) {
|
|
|
|
errs = multierror.Append(errs, fmt.Errorf("you cannot remove a running container %s. Stop the container before attempting removal or force remove", id))
|
|
|
|
} else if errdefs.IsNotFoundError(err) {
|
|
|
|
errs = multierror.Append(errs, fmt.Errorf("container %s not found", id))
|
|
|
|
} else {
|
|
|
|
errs = multierror.Append(errs, err)
|
|
|
|
}
|
2020-05-14 20:58:14 +02:00
|
|
|
continue
|
|
|
|
}
|
2020-08-11 15:46:29 +02:00
|
|
|
|
2020-05-14 20:58:14 +02:00
|
|
|
fmt.Println(id)
|
|
|
|
}
|
2020-08-05 11:31:42 +02:00
|
|
|
if errs != nil {
|
|
|
|
errs.ErrorFormat = formatErrors
|
|
|
|
}
|
2020-05-14 20:58:14 +02:00
|
|
|
return errs.ErrorOrNil()
|
|
|
|
}
|
2020-08-05 11:31:42 +02:00
|
|
|
|
|
|
|
func formatErrors(errs []error) string {
|
|
|
|
messages := make([]string, len(errs))
|
|
|
|
for i, err := range errs {
|
2020-08-11 17:36:54 +02:00
|
|
|
messages[i] = "Error: " + err.Error()
|
2020-08-05 11:31:42 +02:00
|
|
|
}
|
|
|
|
return strings.Join(messages, "\n")
|
|
|
|
}
|