summaryrefslogtreecommitdiff
path: root/pkg/domain/infra/tunnel/containers.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/domain/infra/tunnel/containers.go')
-rw-r--r--pkg/domain/infra/tunnel/containers.go48
1 files changed, 33 insertions, 15 deletions
diff --git a/pkg/domain/infra/tunnel/containers.go b/pkg/domain/infra/tunnel/containers.go
index 4f72eab96..ae689f1f7 100644
--- a/pkg/domain/infra/tunnel/containers.go
+++ b/pkg/domain/infra/tunnel/containers.go
@@ -188,35 +188,53 @@ func (ic *ContainerEngine) ContainerRm(ctx context.Context, namesOrIds []string,
if opts.Timeout != nil {
options = options.WithTimeout(*opts.Timeout)
}
+
+ toRemove := []string{}
+ alreadyRemoved := make(map[string]bool) // Avoids trying to remove already removed containers
if opts.All {
- ctrs, err := getContainersByContext(ic.ClientCtx, opts.All, opts.Ignore, namesOrIds)
+ ctrs, err := getContainersByContext(ic.ClientCtx, opts.All, opts.Ignore, nil)
if err != nil {
return nil, err
}
- rmReports := make([]*reports.RmReport, 0, len(ctrs))
for _, c := range ctrs {
- report, err := containers.Remove(ic.ClientCtx, c.ID, options)
+ toRemove = append(toRemove, c.ID)
+ }
+ } else {
+ for _, ctr := range namesOrIds {
+ // NOTE that we set ignore=true here to support
+ // removing external containers (e.g., Buildah
+ // containers). If we don't find the container,
+ // we'll use the raw input provided by the user
+ // instead of the ID. Since this can only happen
+ // with external containers, it poses no threat
+ // to the `alreadyRemoved` checks below.
+ ctrs, err := getContainersByContext(ic.ClientCtx, false, true, []string{ctr})
if err != nil {
- return rmReports, err
+ return nil, err
}
- rmReports = append(rmReports, report...)
+ id := ctr
+ if len(ctrs) == 1 {
+ id = ctrs[0].ID
+ }
+ toRemove = append(toRemove, id)
}
- return rmReports, nil
}
- rmReports := make([]*reports.RmReport, 0, len(namesOrIds))
- for _, name := range namesOrIds {
- report, err := containers.Remove(ic.ClientCtx, name, options)
+ rmReports := make([]*reports.RmReport, 0, len(toRemove))
+ for _, nameOrID := range toRemove {
+ if alreadyRemoved[nameOrID] {
+ continue
+ }
+ newReports, err := containers.Remove(ic.ClientCtx, nameOrID, options)
if err != nil {
- rmReports = append(rmReports, &reports.RmReport{
- Id: name,
- Err: err,
- })
+ rmReports = append(rmReports, &reports.RmReport{Id: nameOrID, Err: err})
continue
}
- rmReports = append(rmReports, report...)
+ for i := range newReports {
+ alreadyRemoved[newReports[i].Id] = true
+ rmReports = append(rmReports, newReports[i])
+ }
}
-
return rmReports, nil
}