Skip to content

Commit 26d03e5

Browse files
Provide more useful message if removing of volume fails. (ddev#4635)
1 parent 53f49ba commit 26d03e5

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

pkg/dockerutil/dockerutils.go

+22-6
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@ import (
44
"bufio"
55
"bytes"
66
"fmt"
7-
ddevexec "github.com/drud/ddev/pkg/exec"
8-
"github.com/drud/ddev/pkg/fileutil"
9-
"github.com/drud/ddev/pkg/globalconfig"
10-
"github.com/drud/ddev/pkg/versionconstants"
117
"io"
128
"log"
139
"net"
@@ -21,10 +17,16 @@ import (
2117
"strings"
2218
"time"
2319

20+
ddevexec "github.com/drud/ddev/pkg/exec"
21+
"github.com/drud/ddev/pkg/fileutil"
22+
"github.com/drud/ddev/pkg/globalconfig"
23+
"github.com/drud/ddev/pkg/versionconstants"
24+
25+
"net/url"
26+
2427
"github.com/drud/ddev/pkg/archive"
2528
"github.com/drud/ddev/pkg/nodeps"
2629
"github.com/drud/ddev/pkg/util"
27-
"net/url"
2830

2931
"github.com/Masterminds/semver/v3"
3032
"github.com/drud/ddev/pkg/output"
@@ -998,7 +1000,21 @@ func RemoveVolume(volumeName string) error {
9981000
err := client.RemoveVolumeWithOptions(docker.RemoveVolumeOptions{Name: volumeName})
9991001
if err != nil {
10001002
if err.Error() == "volume in use and cannot be removed" {
1001-
return fmt.Errorf("Docker volume '%s' is in use by a container and cannot be removed. Use 'docker rm -f $(docker ps -aq)' to stop all containers", volumeName)
1003+
containers, err := client.ListContainers(docker.ListContainersOptions{
1004+
All: true,
1005+
Filters: map[string][]string{"volume": {volumeName}},
1006+
})
1007+
// Get names of containers which are still using the volume.
1008+
var containerNames []string
1009+
if err == nil {
1010+
for _, container := range containers {
1011+
// Skip first character, it's a slash.
1012+
containerNames = append(containerNames, container.Names[0][1:])
1013+
}
1014+
var containerNamesString = strings.Join(containerNames, " ")
1015+
return fmt.Errorf("Docker volume '%s' is in use by one or more containers and cannot be removed. Use 'docker rm -f %s' to remove them", volumeName, containerNamesString)
1016+
}
1017+
return fmt.Errorf("Docker volume '%s' is in use by a container and cannot be removed. Use 'docker rm -f $(docker ps -aq)' to remove all containers", volumeName)
10021018
}
10031019
return err
10041020
}

0 commit comments

Comments
 (0)