diff --git a/cmd/ddev/cmd/debug-dockercheck.go b/cmd/ddev/cmd/debug-dockercheck.go index 4891df6eabd..2f5b06387ef 100644 --- a/cmd/ddev/cmd/debug-dockercheck.go +++ b/cmd/ddev/cmd/debug-dockercheck.go @@ -73,14 +73,14 @@ var DebugDockercheckCmd = &cobra.Command{ } uid, _, _ := util.GetContainerUIDGid() - _, 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) + _, 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) if err != nil { util.Warning("Unable to run simple container: %v; output=%s", err, out) } else { util.Success("Able to run simple container that mounts a volume.") } - _, _, 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) + _, _, 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) if err != nil { util.Warning("Unable to run use internet inside container, many things will fail: %v", err) } else { diff --git a/cmd/ddev/cmd/debug-nfsmount.go b/cmd/ddev/cmd/debug-nfsmount.go index 41a10ceb710..a6342206c3c 100644 --- a/cmd/ddev/cmd/debug-nfsmount.go +++ b/cmd/ddev/cmd/debug-nfsmount.go @@ -62,7 +62,7 @@ var DebugNFSMountCmd = &cobra.Command{ _ = volume uidStr, _, _ := util.GetContainerUIDGid() - _, 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) + _, 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) if err != nil { 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") util.Failed("Details: error=%v\noutput=%v", err, out) diff --git a/pkg/ddevapp/commands.go b/pkg/ddevapp/commands.go index ee1ae455509..2594424e9bb 100644 --- a/pkg/ddevapp/commands.go +++ b/pkg/ddevapp/commands.go @@ -64,5 +64,5 @@ func performTaskInContainer(command []string) (string, string, error) { // If there is no running active site, use an anonymous container instead. containerName := "performTaskInContainer" + nodeps.RandomString(12) uid, _, _ := util.GetContainerUIDGid() - 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) + 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) } diff --git a/pkg/ddevapp/db.go b/pkg/ddevapp/db.go index 5e91aa5cfbe..d060a802043 100644 --- a/pkg/ddevapp/db.go +++ b/pkg/ddevapp/db.go @@ -12,7 +12,7 @@ import ( // GetExistingDBType returns type/version like mariadb:10.11 or postgres:13 or "" if no existing volume // This has to make a Docker container run so is fairly costly. func (app *DdevApp) GetExistingDBType() (string, error) { - _, 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) + _, 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) if err != nil { util.Failed("Failed to RunSimpleContainer to inspect database version/type: %v, output=%s", err, out) diff --git a/pkg/ddevapp/ddevapp.go b/pkg/ddevapp/ddevapp.go index ba211697cf8..52c3e19a938 100644 --- a/pkg/ddevapp/ddevapp.go +++ b/pkg/ddevapp/ddevapp.go @@ -1168,7 +1168,7 @@ Fix with 'ddev config global --required-docker-compose-version="" --use-docker-c // TODO: We shouldn't be chowning /var/lib/mysql if PostgreSQL? util.Debug("chowning /mnt/ddev-global-cache and /var/lib/mysql to %s", uid) - _, 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) + _, 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) if err != nil { return fmt.Errorf("failed to RunSimpleContainer to chown volumes: %v, output=%s", err, out) } @@ -1178,7 +1178,7 @@ Fix with 'ddev config global --required-docker-compose-version="" --use-docker-c // uid is 999 instead of current user if app.Database.Type == nodeps.Postgres { util.Debug("chowning chowning /var/lib/postgresql/data to 999") - _, 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) + _, 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) if err != nil { return fmt.Errorf("failed to RunSimpleContainer to chown PostgreSQL volume: %v, output=%s", err, out) } @@ -2479,7 +2479,7 @@ func (app *DdevApp) Stop(removeData bool, createSnapshot bool) error { if removeData { 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) util.Debug("Cleaning ddev-global-cache with command '%s'", c) - _, 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) + _, 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) if err != nil { util.Warning("Unable to clean up ddev-global-cache with command '%s': %v; output='%s'", c, err, out) } diff --git a/pkg/ddevapp/ddevapp_test.go b/pkg/ddevapp/ddevapp_test.go index 839b0cee1e0..13acfa3c490 100644 --- a/pkg/ddevapp/ddevapp_test.go +++ b/pkg/ddevapp/ddevapp_test.go @@ -2999,7 +2999,7 @@ func TestRouterPortsCheck(t *testing.T) { }, } - containerID, out, err := dockerutil.RunSimpleContainer(ddevImages.GetWebImage(), t.Name()+"occupyport", nil, []string{}, []string{}, nil, "", false, true, map[string]string{"ddevtestcontainer": t.Name()}, portBinding) + containerID, out, err := dockerutil.RunSimpleContainer(ddevImages.GetWebImage(), t.Name()+"occupyport", nil, []string{}, []string{}, nil, "", false, true, map[string]string{"ddevtestcontainer": t.Name()}, portBinding, nil) if err != nil { t.Fatalf("Failed to run Docker command to occupy port 80/443, err=%v output=%v", err, out) diff --git a/pkg/ddevapp/poweroff.go b/pkg/ddevapp/poweroff.go index 5172deef695..d299af12cb3 100644 --- a/pkg/ddevapp/poweroff.go +++ b/pkg/ddevapp/poweroff.go @@ -14,7 +14,7 @@ func PowerOff() { // Remove any custom certs that may have been added // along with all Traefik configuration. - _, _, 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) + _, _, 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) if err != nil { util.Warning("Failed removing custom certs/traefik configuration: %v", err) } diff --git a/pkg/dockerutil/dockerutils.go b/pkg/dockerutil/dockerutils.go index e54a14eae73..e39cc7e0f40 100644 --- a/pkg/dockerutil/dockerutils.go +++ b/pkg/dockerutil/dockerutils.go @@ -49,6 +49,13 @@ type ComposeCmdOpts struct { Progress bool // Add dots every second while the compose command is running } +// NoHealthCheck is a HealthConfig that disables any existing healthcheck when +// running a container. Used by RunSimpleContainer +// See https://pkg.go.dev/github.com/moby/docker-image-spec/specs-go/v1#HealthcheckConfig +var NoHealthCheck = dockerContainer.HealthConfig{ + Test: []string{"NONE"}, // Disables any existing health check +} + // EnsureNetwork will ensure the Docker network for DDEV is created. func EnsureNetwork(ctx context.Context, client *dockerClient.Client, name string, netOptions dockerTypes.NetworkCreate) error { // Pre-check for network duplicates @@ -891,10 +898,14 @@ func GetDockerIP() (string, error) { // RunSimpleContainer runs a container (non-daemonized) and captures the stdout/stderr. // It will block, so not to be run on a container whose entrypoint or cmd might hang or run too long. // This should be the equivalent of something like -// 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" +// 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" // Example code from https://gist.github.com/fsouza/b0bf3043827f8e39c4589e88cec067d8 +// Default behavior is to use the image's healthcheck (healthConfig == nil) +// When passed a pointer to HealthConfig (often &dockerutils.NoHealthCheck) it can turn off healthcheck +// or it can replace it or have other behaviors, see +// https://pkg.go.dev/github.com/moby/docker-image-spec/specs-go/v1#HealthcheckConfig // Returns containerID, output, error -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) { +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) { ctx, client := GetDockerClient() // Ensure image string includes a tag @@ -949,6 +960,7 @@ func RunSimpleContainer(image string, name string, cmd []string, entrypoint []st Entrypoint: entrypoint, AttachStderr: true, AttachStdout: true, + Healthcheck: healthConfig, } containerHostConfig := &dockerContainer.HostConfig{ @@ -1409,7 +1421,7 @@ func CopyIntoVolume(sourcePath string, volumeName string, targetSubdir string, u containerName := "CopyIntoVolume_" + nodeps.RandomString(12) track := util.TimeTrackC("CopyIntoVolume " + sourcePath + " " + volumeName) - 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) + 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) if err != nil { return err } @@ -1481,7 +1493,7 @@ func Exec(containerID string, command string, uid string) (string, string, error // CheckAvailableSpace outputs a warning if Docker space is low func CheckAvailableSpace() { - _, 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) + _, 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) out = strings.Trim(out, "% \r\n") parts := strings.Split(out, " ") if len(parts) != 2 { diff --git a/pkg/dockerutil/dockerutils_test.go b/pkg/dockerutil/dockerutils_test.go index cac5789ae1f..5ffb0a1a073 100644 --- a/pkg/dockerutil/dockerutils_test.go +++ b/pkg/dockerutil/dockerutils_test.go @@ -114,7 +114,7 @@ func startTestContainer() (string, error) { "HOTDOG=superior-to-corndog", "POTATO=future-fry", "DDEV_WEBSERVER_TYPE=nginx-fpm", - }, nil, "33", false, true, map[string]string{"com.docker.compose.service": "web", "com.ddev.site-name": testContainerName}, portBinding) + }, nil, "33", false, true, map[string]string{"com.docker.compose.service": "web", "com.ddev.site-name": testContainerName}, portBinding, nil) if err != nil { return "", err } @@ -142,7 +142,7 @@ func TestGetContainerHealth(t *testing.T) { _, err = startTestContainer() assert.NoError(err) healthDetail, err := dockerutil.ContainerWait(30, labels) - assert.NoError(err, "healtdetail='%s'", healthDetail) + assert.NoError(err, "healthDetail='%s'", healthDetail) container, err = dockerutil.FindContainerByLabels(labels) assert.NoError(err) @@ -158,7 +158,7 @@ func TestGetContainerHealth(t *testing.T) { require.NotNil(t, container) status, log := dockerutil.GetContainerHealth(container) - assert.Equal(status, "healthy", "container should be healthy; log=%v", log) + assert.Equal("healthy", status, "container should be healthy; log=%v", log) // Now break the container and make sure it's unhealthy timeout := 10 @@ -166,7 +166,7 @@ func TestGetContainerHealth(t *testing.T) { assert.NoError(err) status, log = dockerutil.GetContainerHealth(container) - assert.Equal(status, "unhealthy", "container should be unhealthy; log=%v", log) + assert.Equal("unhealthy", status, "container should be unhealthy; log=%v", log) assert.NoError(err) } @@ -202,7 +202,7 @@ func TestContainerWait(t *testing.T) { // and note that it exited. labels = map[string]string{"test": "quickexit"} _ = dockerutil.RemoveContainersByLabels(labels) - cID, _, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, t.Name()+util.RandString(5), []string{"ls"}, nil, nil, nil, "0", false, true, labels, nil) + cID, _, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, t.Name()+util.RandString(5), []string{"ls"}, nil, nil, nil, "0", false, true, labels, nil, nil) t.Cleanup(func() { _ = dockerutil.RemoveContainer(cID) }) @@ -216,7 +216,7 @@ func TestContainerWait(t *testing.T) { // it should be found as good immediately labels = map[string]string{"test": "nohealthcheck"} _ = dockerutil.RemoveContainersByLabels(labels) - cID, _, err = dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, t.Name()+util.RandString(5), []string{"sleep", "60"}, nil, nil, nil, "0", false, true, labels, nil) + cID, _, err = dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, t.Name()+util.RandString(5), []string{"sleep", "60"}, nil, nil, nil, "0", false, true, labels, nil, nil) t.Cleanup(func() { _ = dockerutil.RemoveContainer(cID) }) @@ -230,7 +230,7 @@ func TestContainerWait(t *testing.T) { // Use ddev-webserver for this; it won't have good health on normal run labels = map[string]string{"test": "hashealthcheckbutbad"} _ = dockerutil.RemoveContainersByLabels(labels) - cID, _, err = dockerutil.RunSimpleContainer(ddevWebserver, t.Name()+util.RandString(5), []string{"sleep", "5"}, nil, []string{"DDEV_WEBSERVER_TYPE=nginx-fpm"}, nil, "0", false, true, labels, nil) + cID, _, err = dockerutil.RunSimpleContainer(ddevWebserver, t.Name()+util.RandString(5), []string{"sleep", "5"}, nil, []string{"DDEV_WEBSERVER_TYPE=nginx-fpm"}, nil, "0", false, true, labels, nil, nil) t.Cleanup(func() { _ = dockerutil.RemoveContainer(cID) }) @@ -244,7 +244,7 @@ func TestContainerWait(t *testing.T) { // then ContainerWait should detect failure early, but should succeed later labels = map[string]string{"test": "hashealthcheckbutbad"} _ = dockerutil.RemoveContainersByLabels(labels) - cID, _, err = dockerutil.RunSimpleContainer(ddevWebserver, t.Name()+util.RandString(5), []string{"bash", "-c", "sleep 5 && /start.sh"}, nil, []string{"DDEV_WEBSERVER_TYPE=nginx-fpm"}, nil, "0", false, true, labels, nil) + cID, _, err = dockerutil.RunSimpleContainer(ddevWebserver, t.Name()+util.RandString(5), []string{"bash", "-c", "sleep 5 && /start.sh"}, nil, []string{"DDEV_WEBSERVER_TYPE=nginx-fpm"}, nil, "0", false, true, labels, nil, nil) t.Cleanup(func() { _ = dockerutil.RemoveContainer(cID) }) @@ -397,7 +397,7 @@ func TestFindContainerByName(t *testing.T) { } // Run a container, don't remove it. - cID, _, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, containerName, []string{"//tempmount/sleepALittle.sh"}, nil, nil, []string{testdata + "://tempmount"}, "25", false, false, nil, nil) + cID, _, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, containerName, []string{"//tempmount/sleepALittle.sh"}, nil, nil, []string{testdata + "://tempmount"}, "25", false, false, nil, nil, nil) assert.NoError(err) defer func() { @@ -444,35 +444,35 @@ func TestRunSimpleContainer(t *testing.T) { assert.DirExists(testdata) // Try the success case; script found, runs, all good. - _, out, err := dockerutil.RunSimpleContainer("busybox:latest", "TestRunSimpleContainer"+basename, []string{"//tempmount/simplescript.sh"}, nil, []string{"TEMPENV=someenv"}, []string{testdata + "://tempmount"}, "25", true, false, nil, nil) + _, out, err := dockerutil.RunSimpleContainer("busybox:latest", "TestRunSimpleContainer"+basename, []string{"//tempmount/simplescript.sh"}, nil, []string{"TEMPENV=someenv"}, []string{testdata + "://tempmount"}, "25", true, false, nil, nil, nil) assert.NoError(err) assert.Contains(out, "simplescript.sh; TEMPENV=someenv UID=25") assert.Contains(out, "stdout is captured") assert.Contains(out, "stderr is also captured") // Try the case of running nonexistent script - _, _, err = dockerutil.RunSimpleContainer("busybox:latest", "TestRunSimpleContainer"+basename, []string{"nocommandbythatname"}, nil, []string{"TEMPENV=someenv"}, []string{testdata + ":/tempmount"}, "25", true, false, nil, nil) + _, _, err = dockerutil.RunSimpleContainer("busybox:latest", "TestRunSimpleContainer"+basename, []string{"nocommandbythatname"}, nil, []string{"TEMPENV=someenv"}, []string{testdata + ":/tempmount"}, "25", true, false, nil, nil, nil) assert.Error(err) if err != nil { assert.Contains(err.Error(), "failed to StartContainer") } // Try the case of running a script that fails - _, _, err = dockerutil.RunSimpleContainer("busybox:latest", "TestRunSimpleContainer"+basename, []string{"/tempmount/simplescript.sh"}, nil, []string{"TEMPENV=someenv", "ERROROUT=true"}, []string{testdata + ":/tempmount"}, "25", true, false, nil, nil) + _, _, err = dockerutil.RunSimpleContainer("busybox:latest", "TestRunSimpleContainer"+basename, []string{"/tempmount/simplescript.sh"}, nil, []string{"TEMPENV=someenv", "ERROROUT=true"}, []string{testdata + ":/tempmount"}, "25", true, false, nil, nil, nil) assert.Error(err) if err != nil { assert.Contains(err.Error(), "container run failed with exit code 5") } // Provide an unqualified tag name - _, _, err = dockerutil.RunSimpleContainer("busybox", "TestRunSimpleContainer"+basename, nil, nil, nil, nil, "", true, false, nil, nil) + _, _, err = dockerutil.RunSimpleContainer("busybox", "TestRunSimpleContainer"+basename, nil, nil, nil, nil, "", true, false, nil, nil, nil) assert.Error(err) if err != nil { assert.Contains(err.Error(), "image name must specify tag") } // Provide a malformed tag name - _, _, err = dockerutil.RunSimpleContainer("busybox:", "TestRunSimpleContainer"+basename, nil, nil, nil, nil, "", true, false, nil, nil) + _, _, err = dockerutil.RunSimpleContainer("busybox:", "TestRunSimpleContainer"+basename, nil, nil, nil, nil, "", true, false, nil, nil, nil) assert.Error(err) if err != nil { assert.Contains(err.Error(), "malformed tag provided") @@ -498,7 +498,7 @@ func TestDockerExec(t *testing.T) { assert := asrt.New(t) ctx, client := dockerutil.GetDockerClient() - id, _, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"tail", "-f", "/dev/null"}, nil, nil, nil, "0", false, true, nil, nil) + id, _, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"tail", "-f", "/dev/null"}, nil, nil, nil, "0", false, true, nil, nil, nil) assert.NoError(err) t.Cleanup(func() { @@ -586,7 +586,7 @@ func TestCopyIntoVolume(t *testing.T) { // Make sure that the content is the same, and that .test.sh is executable // On Windows the upload can result in losing executable bit - _, out, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"sh", "-c", "cd /mnt/" + t.Name() + " && ls -R .test.sh * && ./.test.sh"}, nil, nil, []string{t.Name() + ":/mnt/" + t.Name()}, "25", true, false, nil, nil) + _, out, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"sh", "-c", "cd /mnt/" + t.Name() + " && ls -R .test.sh * && ./.test.sh"}, nil, nil, []string{t.Name() + ":/mnt/" + t.Name()}, "25", true, false, nil, nil, nil) assert.NoError(err) assert.Equal(`.test.sh root.txt @@ -598,7 +598,7 @@ hi this is a test file err = dockerutil.CopyIntoVolume(filepath.Join(pwd, "testdata", t.Name()), t.Name(), "somesubdir", "501", "", true) assert.NoError(err) - _, out, err = dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"sh", "-c", "cd /mnt/" + t.Name() + "/somesubdir && pwd && ls -R"}, nil, nil, []string{t.Name() + ":/mnt/" + t.Name()}, "0", true, false, nil, nil) + _, out, err = dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"sh", "-c", "cd /mnt/" + t.Name() + "/somesubdir && pwd && ls -R"}, nil, nil, []string{t.Name() + ":/mnt/" + t.Name()}, "0", true, false, nil, nil, nil) assert.NoError(err) assert.Equal(`/mnt/TestCopyIntoVolume/somesubdir .: @@ -614,7 +614,7 @@ subdir1.txt assert.NoError(err) // Make sure that the content is the same, and that .test.sh is executable - _, out, err = dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"cat", "/mnt/" + t.Name() + "/root.txt"}, nil, nil, []string{t.Name() + ":/mnt/" + t.Name()}, "25", true, false, nil, nil) + _, out, err = dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"cat", "/mnt/" + t.Name() + "/root.txt"}, nil, nil, []string{t.Name() + ":/mnt/" + t.Name()}, "25", true, false, nil, nil, nil) assert.NoError(err) assert.Equal("root.txt here\n", out) diff --git a/pkg/fileutil/file_hash_test.go b/pkg/fileutil/file_hash_test.go index d97d633761f..64b4bb48d16 100644 --- a/pkg/fileutil/file_hash_test.go +++ b/pkg/fileutil/file_hash_test.go @@ -51,7 +51,7 @@ func TestFileHash(t *testing.T) { func externalComputeSha1Sum(filePath string) (string, error) { dir := filepath.Dir(filePath) fileName := filepath.Base(filePath) - _, out, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"sha1sum", path.Join("/var/tmp/checkdir/", fileName)}, nil, nil, []string{dir + ":" + "/var/tmp/checkdir"}, "0", true, false, nil, nil) + _, out, err := dockerutil.RunSimpleContainer(versionconstants.BusyboxImage, "", []string{"sha1sum", path.Join("/var/tmp/checkdir/", fileName)}, nil, nil, []string{dir + ":" + "/var/tmp/checkdir"}, "0", true, false, nil, nil, nil) if err != nil { return "", err