Skip to content

Commit a0620b8

Browse files
authored
fix: don't label transient containers and run without healthcheck, fixes ddev#6085 (ddev#6089)
1 parent 8bfa3e5 commit a0620b8

File tree

10 files changed

+45
-33
lines changed

10 files changed

+45
-33
lines changed

cmd/ddev/cmd/debug-dockercheck.go

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

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

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

cmd/ddev/cmd/debug-nfsmount.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ var DebugNFSMountCmd = &cobra.Command{
6262
_ = volume
6363
uidStr, _, _ := util.GetContainerUIDGid()
6464

65-
_, out, err := dockerutil.RunSimpleContainer(docker.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": ""}, nil)
65+
_, out, err := dockerutil.RunSimpleContainer(docker.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": ""}, nil, nil)
6666
if err != nil {
6767
util.Warning("NFS does not seem to be set up yet, see debugging instructions at https://ddev.readthedocs.io/en/stable/users/install/performance/#nfs")
6868
util.Failed("Details: error=%v\noutput=%v", err, out)

pkg/ddevapp/commands.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,5 @@ func performTaskInContainer(command []string) (string, string, error) {
6464
// If there is no running active site, use an anonymous container instead.
6565
containerName := "performTaskInContainer" + nodeps.RandomString(12)
6666
uid, _, _ := util.GetContainerUIDGid()
67-
return dockerutil.RunSimpleContainer(dockerImages.GetWebImage(), containerName, command, nil, nil, []string{"ddev-global-cache:/mnt/ddev-global-cache"}, uid, true, false, map[string]string{"com.ddev.site-name": ""}, nil)
67+
return dockerutil.RunSimpleContainer(dockerImages.GetWebImage(), containerName, command, nil, nil, []string{"ddev-global-cache:/mnt/ddev-global-cache"}, uid, true, false, map[string]string{"com.ddev.site-name": ""}, nil, &dockerutil.NoHealthCheck)
6868
}

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.11 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.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()}, 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`: ""}, nil, nil)
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

+3-3
Original file line numberDiff line numberDiff line change
@@ -1168,7 +1168,7 @@ Fix with 'ddev config global --required-docker-compose-version="" --use-docker-c
11681168

11691169
// TODO: We shouldn't be chowning /var/lib/mysql if PostgreSQL?
11701170
util.Debug("chowning /mnt/ddev-global-cache and /var/lib/mysql to %s", uid)
1171-
_, out, err := dockerutil.RunSimpleContainer(ddevImages.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}, nil)
1171+
_, out, err := dockerutil.RunSimpleContainer(ddevImages.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": ""}, nil, &dockerutil.NoHealthCheck)
11721172
if err != nil {
11731173
return fmt.Errorf("failed to RunSimpleContainer to chown volumes: %v, output=%s", err, out)
11741174
}
@@ -1178,7 +1178,7 @@ Fix with 'ddev config global --required-docker-compose-version="" --use-docker-c
11781178
// uid is 999 instead of current user
11791179
if app.Database.Type == nodeps.Postgres {
11801180
util.Debug("chowning chowning /var/lib/postgresql/data to 999")
1181-
_, out, err := dockerutil.RunSimpleContainer(ddevImages.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}, nil)
1181+
_, out, err := dockerutil.RunSimpleContainer(ddevImages.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": ""}, nil, &dockerutil.NoHealthCheck)
11821182
if err != nil {
11831183
return fmt.Errorf("failed to RunSimpleContainer to chown PostgreSQL volume: %v, output=%s", err, out)
11841184
}
@@ -2479,7 +2479,7 @@ func (app *DdevApp) Stop(removeData bool, createSnapshot bool) error {
24792479
if removeData {
24802480
c := fmt.Sprintf("rm -rf /mnt/ddev-global-cache/*/%s-{web,db} /mnt/ddev-global-cache/traefik/*/%s.{yaml,crt,key}", app.Name, app.Name)
24812481
util.Debug("Cleaning ddev-global-cache with command '%s'", c)
2482-
_, out, err := dockerutil.RunSimpleContainer(ddevImages.GetWebImage(), "clean-ddev-global-cache-"+util.RandString(6), []string{"bash", "-c", c}, []string{}, []string{}, []string{"ddev-global-cache:/mnt/ddev-global-cache"}, "", true, false, map[string]string{`com.ddev.site-name`: app.GetName()}, nil)
2482+
_, out, err := dockerutil.RunSimpleContainer(ddevImages.GetWebImage(), "clean-ddev-global-cache-"+util.RandString(6), []string{"bash", "-c", c}, []string{}, []string{}, []string{"ddev-global-cache:/mnt/ddev-global-cache"}, "", true, false, map[string]string{`com.ddev.site-name`: ""}, nil, &dockerutil.NoHealthCheck)
24832483
if err != nil {
24842484
util.Warning("Unable to clean up ddev-global-cache with command '%s': %v; output='%s'", c, err, out)
24852485
}

pkg/ddevapp/ddevapp_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2999,7 +2999,7 @@ func TestRouterPortsCheck(t *testing.T) {
29992999
},
30003000
}
30013001

3002-
containerID, out, err := dockerutil.RunSimpleContainer(ddevImages.GetWebImage(), t.Name()+"occupyport", nil, []string{}, []string{}, nil, "", false, true, map[string]string{"ddevtestcontainer": t.Name()}, portBinding)
3002+
containerID, out, err := dockerutil.RunSimpleContainer(ddevImages.GetWebImage(), t.Name()+"occupyport", nil, []string{}, []string{}, nil, "", false, true, map[string]string{"ddevtestcontainer": t.Name()}, portBinding, nil)
30033003

30043004
if err != nil {
30053005
t.Fatalf("Failed to run Docker command to occupy port 80/443, err=%v output=%v", err, out)

pkg/ddevapp/poweroff.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func PowerOff() {
1414

1515
// Remove any custom certs that may have been added
1616
// along with all Traefik configuration.
17-
_, _, 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": ""}, nil)
17+
_, _, 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": ""}, nil, &dockerutil.NoHealthCheck)
1818
if err != nil {
1919
util.Warning("Failed removing custom certs/traefik configuration: %v", err)
2020
}

pkg/dockerutil/dockerutils.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ type ComposeCmdOpts struct {
4949
Progress bool // Add dots every second while the compose command is running
5050
}
5151

52+
// NoHealthCheck is a HealthConfig that disables any existing healthcheck when
53+
// running a container. Used by RunSimpleContainer
54+
// See https://pkg.go.dev/github.com/moby/docker-image-spec/specs-go/v1#HealthcheckConfig
55+
var NoHealthCheck = dockerContainer.HealthConfig{
56+
Test: []string{"NONE"}, // Disables any existing health check
57+
}
58+
5259
// EnsureNetwork will ensure the Docker network for DDEV is created.
5360
func EnsureNetwork(ctx context.Context, client *dockerClient.Client, name string, netOptions dockerTypes.NetworkCreate) error {
5461
// Pre-check for network duplicates
@@ -891,10 +898,14 @@ func GetDockerIP() (string, error) {
891898
// RunSimpleContainer runs a container (non-daemonized) and captures the stdout/stderr.
892899
// It will block, so not to be run on a container whose entrypoint or cmd might hang or run too long.
893900
// This should be the equivalent of something like
894-
// docker run -t -u '%s:%s' -e SNAPSHOT_NAME='%s' -v '%s:/mnt/ddev_config' -v '%s:/var/lib/mysql' --rm --entrypoint=/migrate_file_to_volume.sh %s:%s"
901+
// docker run -t -u '%s:%s' -e SNAPSHOT_NAME='%s' -v '%s:/mnt/ddev_config' -v '%s:/var/lib/mysql' --no-healthcheck --rm --entrypoint=/migrate_file_to_volume.sh %s:%s"
895902
// Example code from https://gist.github.com/fsouza/b0bf3043827f8e39c4589e88cec067d8
903+
// Default behavior is to use the image's healthcheck (healthConfig == nil)
904+
// When passed a pointer to HealthConfig (often &dockerutils.NoHealthCheck) it can turn off healthcheck
905+
// or it can replace it or have other behaviors, see
906+
// https://pkg.go.dev/github.com/moby/docker-image-spec/specs-go/v1#HealthcheckConfig
896907
// Returns containerID, output, error
897-
func RunSimpleContainer(image string, name string, cmd []string, entrypoint []string, env []string, binds []string, uid string, removeContainerAfterRun bool, detach bool, labels map[string]string, portBindings nat.PortMap) (containerID string, output string, returnErr error) {
908+
func RunSimpleContainer(image string, name string, cmd []string, entrypoint []string, env []string, binds []string, uid string, removeContainerAfterRun bool, detach bool, labels map[string]string, portBindings nat.PortMap, healthConfig *dockerContainer.HealthConfig) (containerID string, output string, returnErr error) {
898909
ctx, client := GetDockerClient()
899910

900911
// Ensure image string includes a tag
@@ -949,6 +960,7 @@ func RunSimpleContainer(image string, name string, cmd []string, entrypoint []st
949960
Entrypoint: entrypoint,
950961
AttachStderr: true,
951962
AttachStdout: true,
963+
Healthcheck: healthConfig,
952964
}
953965

954966
containerHostConfig := &dockerContainer.HostConfig{
@@ -1409,7 +1421,7 @@ func CopyIntoVolume(sourcePath string, volumeName string, targetSubdir string, u
14091421
containerName := "CopyIntoVolume_" + nodeps.RandomString(12)
14101422

14111423
track := util.TimeTrackC("CopyIntoVolume " + sourcePath + " " + volumeName)
1412-
containerID, _, err := RunSimpleContainer(ddevImages.GetWebImage(), containerName, []string{"sh", "-c", "mkdir -p " + targetSubdirFullPath + " && sleep infinity"}, nil, nil, []string{volumeName + ":" + volPath}, "0", false, true, map[string]string{"com.ddev.site-name": ""}, nil)
1424+
containerID, _, err := RunSimpleContainer(ddevImages.GetWebImage(), containerName, []string{"sh", "-c", "mkdir -p " + targetSubdirFullPath + " && sleep infinity"}, nil, nil, []string{volumeName + ":" + volPath}, "0", false, true, map[string]string{"com.ddev.site-name": ""}, nil, nil)
14131425
if err != nil {
14141426
return err
14151427
}
@@ -1481,7 +1493,7 @@ func Exec(containerID string, command string, uid string) (string, string, error
14811493

14821494
// CheckAvailableSpace outputs a warning if Docker space is low
14831495
func CheckAvailableSpace() {
1484-
_, out, _ := RunSimpleContainer(ddevImages.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": ""}, nil)
1496+
_, out, _ := RunSimpleContainer(ddevImages.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": ""}, nil, nil)
14851497
out = strings.Trim(out, "% \r\n")
14861498
parts := strings.Split(out, " ")
14871499
if len(parts) != 2 {

0 commit comments

Comments
 (0)