Skip to content

Commit 0cb1f20

Browse files
authored
Make sure all containers get cleaned up on stop and poweroff, fixes ddev#4676 (ddev#4680)
1 parent 1f73a04 commit 0cb1f20

File tree

6 files changed

+31
-14
lines changed

6 files changed

+31
-14
lines changed

cmd/ddev/cmd/debug-dockercheck.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,14 @@ var DebugDockercheckCmd = &cobra.Command{
7272
}
7373

7474
uid, _, _ := util.GetContainerUIDGid()
75-
_, _, err = dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), "", []string{"ls", "/mnt/ddev-global-cache"}, []string{}, []string{}, []string{"ddev-global-cache" + ":/mnt/ddev-globa-cache"}, uid, true, false, nil)
75+
_, _, err = dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), "dockercheck-runcontainer--"+util.RandString(6), []string{"ls", "/mnt/ddev-global-cache"}, []string{}, []string{}, []string{"ddev-global-cache" + ":/mnt/ddev-globa-cache"}, uid, true, false, map[string]string{"com.ddev.site-name": ""})
7676
if err != nil {
7777
util.Warning("Unable to run simple container: %v", err)
7878
} else {
7979
util.Success("Able to run simple container that mounts a volume.")
8080
}
8181

82-
_, _, err = dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), "", []string{"curl", "-sfLI", "https://google.com"}, []string{}, []string{}, []string{"ddev-global-cache" + ":/mnt/ddev-globa-cache"}, uid, true, false, nil)
82+
_, _, err = dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), "dockercheck-curl--"+util.RandString(6), []string{"curl", "-sfLI", "https://google.com"}, []string{}, []string{}, []string{"ddev-global-cache" + ":/mnt/ddev-globa-cache"}, uid, true, false, map[string]string{"com.ddev.site-name": ""})
8383
if err != nil {
8484
util.Warning("Unable to run use internet inside container, many things will fail: %v", err)
8585
} else {

cmd/ddev/cmd/debug-nfsmount.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ var DebugNFSMountCmd = &cobra.Command{
5959
_ = volume
6060
uidStr, _, _ := util.GetContainerUIDGid()
6161

62-
_, out, err := dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), containerName, []string{"sh", "-c", "findmnt -T /nfsmount && ls -d /nfsmount/.ddev"}, []string{}, []string{}, []string{"testnfsmount" + ":/nfsmount"}, uidStr, true, false, nil)
62+
_, out, err := dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), containerName, []string{"sh", "-c", "findmnt -T /nfsmount && ls -d /nfsmount/.ddev"}, []string{}, []string{}, []string{"testnfsmount" + ":/nfsmount"}, uidStr, true, false, map[string]string{"com.ddev.site-name": ""})
6363
if err != nil {
6464
util.Warning("NFS does not seem to be set up yet, see debugging instructions at https://ddev.readthedocs.io/en/stable/users/install/performance/#debugging-ddev-start-failures-with-nfs_mount_enabled-true")
6565
util.Failed("Details: error=%v\noutput=%v", err, out)

pkg/ddevapp/db.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
// GetExistingDBType returns type/version like mariadb:10.4 or postgres:13 or "" if no existing volume
1313
// This has to make a docker container run so is fairly costly.
1414
func (app *DdevApp) GetExistingDBType() (string, error) {
15-
_, out, err := dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), "", []string{"sh", "-c", "( test -f /var/tmp/mysql/db_mariadb_version.txt && cat /var/tmp/mysql/db_mariadb_version.txt ) || ( test -f /var/tmp/postgres/PG_VERSION && cat /var/tmp/postgres/PG_VERSION) || true"}, []string{}, []string{}, []string{app.GetMariaDBVolumeName() + ":/var/tmp/mysql", app.GetPostgresVolumeName() + ":/var/tmp/postgres"}, "", true, false, nil)
15+
_, out, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "GetExistingDBType-"+app.Name+"-"+util.RandString(6), []string{"sh", "-c", "( test -f /var/tmp/mysql/db_mariadb_version.txt && cat /var/tmp/mysql/db_mariadb_version.txt ) || ( test -f /var/tmp/postgres/PG_VERSION && cat /var/tmp/postgres/PG_VERSION) || true"}, []string{}, []string{}, []string{app.GetMariaDBVolumeName() + ":/var/tmp/mysql", app.GetPostgresVolumeName() + ":/var/tmp/postgres"}, "", true, false, map[string]string{`com.ddev.site-name`: app.GetName()})
1616

1717
if err != nil {
1818
util.Failed("failed to RunSimpleContainer to inspect database version/type: %v, output=%s", err, out)

pkg/ddevapp/ddevapp.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,11 @@ Please use the built-in docker-compose.
963963
Fix with 'ddev config global --required-docker-compose-version="" --use-docker-compose-from-path=false': %v`, err)
964964
}
965965

966+
err = app.PullBaseContainerImages()
967+
if err != nil {
968+
util.Warning("Unable to pull docker images: %v", err)
969+
}
970+
966971
if !nodeps.ArrayContainsString(app.GetOmittedContainers(), "db") {
967972
// OK to start if dbType is empty (nonexistent) or if it matches
968973
if dbType, err := app.GetExistingDBType(); err != nil || (dbType != "" && dbType != app.Database.Type+":"+app.Database.Version) {
@@ -1051,11 +1056,6 @@ Fix with 'ddev config global --required-docker-compose-version="" --use-docker-c
10511056
return err
10521057
}
10531058

1054-
err = app.PullBaseContainerImages()
1055-
if err != nil {
1056-
util.Warning("Unable to pull docker images: %v", err)
1057-
}
1058-
10591059
dockerutil.CheckAvailableSpace()
10601060

10611061
// Copy any homeadditions content into .ddev/.homeadditions
@@ -1092,15 +1092,15 @@ Fix with 'ddev config global --required-docker-compose-version="" --use-docker-c
10921092
}
10931093
}
10941094

1095-
_, out, err := dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), "", []string{"sh", "-c", fmt.Sprintf("chown -R %s /var/lib/mysql /mnt/ddev-global-cache", uid)}, []string{}, []string{}, []string{app.GetMariaDBVolumeName() + ":/var/lib/mysql", "ddev-global-cache:/mnt/ddev-global-cache"}, "", true, false, nil)
1095+
_, out, err := dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), "start-chown-"+util.RandString(6), []string{"sh", "-c", fmt.Sprintf("chown -R %s /var/lib/mysql /mnt/ddev-global-cache", uid)}, []string{}, []string{}, []string{app.GetMariaDBVolumeName() + ":/var/lib/mysql", "ddev-global-cache:/mnt/ddev-global-cache"}, "", true, false, map[string]string{"com.ddev.site-name": app.Name})
10961096
if err != nil {
10971097
return fmt.Errorf("failed to RunSimpleContainer to chown volumes: %v, output=%s", err, out)
10981098
}
10991099

11001100
// Chown the postgres volume; this shouldn't have to be a separate stanza, but the
11011101
// uid is 999 instead of current user
11021102
if app.Database.Type == nodeps.Postgres {
1103-
_, out, err := dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), "", []string{"sh", "-c", fmt.Sprintf("chown -R %s /var/lib/postgresql/data", "999:999")}, []string{}, []string{}, []string{app.GetPostgresVolumeName() + ":/var/lib/postgresql/data"}, "", true, false, nil)
1103+
_, out, err := dockerutil.RunSimpleContainer(versionconstants.GetWebImage(), "start-postgres-chown-"+util.RandString(6), []string{"sh", "-c", fmt.Sprintf("chown -R %s /var/lib/postgresql/data", "999:999")}, []string{}, []string{}, []string{app.GetPostgresVolumeName() + ":/var/lib/postgresql/data"}, "", true, false, map[string]string{"com.ddev.site-name": app.Name})
11041104
if err != nil {
11051105
return fmt.Errorf("failed to RunSimpleContainer to chown postgres volume: %v, output=%s", err, out)
11061106
}

pkg/ddevapp/poweroff.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ func PowerOff() {
1515

1616
// Remove any custom certs that may have been added
1717
// along with all traefik configuration.
18-
_, _, err = dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"sh", "-c", "rm -rf /mnt/ddev-global-cache/custom_certs/* /mnt/ddev-global-cache/traefik/*"}, []string{}, []string{}, []string{"ddev-global-cache" + ":/mnt/ddev-global-cache"}, "", true, false, nil)
18+
_, _, err = dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "poweroff-"+util.RandString(6), []string{"sh", "-c", "rm -rf /mnt/ddev-global-cache/custom_certs/* /mnt/ddev-global-cache/traefik/*"}, []string{}, []string{}, []string{"ddev-global-cache" + ":/mnt/ddev-global-cache"}, "", true, false, map[string]string{"com.ddev.site-name": ""})
1919
if err != nil {
2020
util.Warning("Failed removing custom certs/traefik configuration: %v", err)
2121
}
@@ -28,6 +28,23 @@ func PowerOff() {
2828
util.Success("Project %s has been stopped.", app.GetName())
2929
}
3030

31+
// Any straggling containers that have label "com.ddev.site-name" should be removed.
32+
client := dockerutil.GetDockerClient()
33+
containers, err := client.ListContainers(docker.ListContainersOptions{
34+
All: true,
35+
Filters: map[string][]string{"label": {"com.ddev.site-name"}},
36+
})
37+
if err == nil {
38+
for _, c := range containers {
39+
err = dockerutil.RemoveContainer(c.ID, 10)
40+
if err != nil {
41+
util.Warning("Failed to remove container %s", c.Names[0])
42+
}
43+
}
44+
} else {
45+
util.Warning("unable to run client.ListContainers(): %v", err)
46+
}
47+
3148
StopMutagenDaemon()
3249

3350
if err := RemoveSSHAgentContainer(); err != nil {

pkg/dockerutil/dockerutils.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,7 @@ func CopyIntoVolume(sourcePath string, volumeName string, targetSubdir string, u
12351235
containerName := "CopyIntoVolume_" + nodeps.RandomString(12)
12361236

12371237
track := util.TimeTrack(time.Now(), "CopyIntoVolume "+sourcePath+" "+volumeName)
1238-
containerID, _, err := RunSimpleContainer(versionconstants.GetWebImage(), containerName, []string{"sh", "-c", "mkdir -p " + targetSubdirFullPath + " && tail -f /dev/null"}, nil, nil, []string{volumeName + ":" + volPath}, "0", false, true, nil)
1238+
containerID, _, err := RunSimpleContainer(versionconstants.GetWebImage(), containerName, []string{"sh", "-c", "mkdir -p " + targetSubdirFullPath + " && tail -f /dev/null"}, nil, nil, []string{volumeName + ":" + volPath}, "0", false, true, map[string]string{"com.ddev.site-name": ""})
12391239
if err != nil {
12401240
return err
12411241
}
@@ -1304,7 +1304,7 @@ func Exec(containerID string, command string, uid string) (string, string, error
13041304

13051305
// CheckAvailableSpace outputs a warning if docker space is low
13061306
func CheckAvailableSpace() {
1307-
_, out, _ := RunSimpleContainer(versionconstants.GetWebImage(), "", []string{"sh", "-c", `df / | awk '!/Mounted/ {print $4, $5;}'`}, []string{}, []string{}, []string{}, "", true, false, nil)
1307+
_, out, _ := RunSimpleContainer(versionconstants.GetWebImage(), "check-available-space-"+util.RandString(6), []string{"sh", "-c", `df / | awk '!/Mounted/ {print $4, $5;}'`}, []string{}, []string{}, []string{}, "", true, false, map[string]string{"com.ddev.site-name": ""})
13081308
out = strings.Trim(out, "% \r\n")
13091309
parts := strings.Split(out, " ")
13101310
if len(parts) != 2 {

0 commit comments

Comments
 (0)