// Test case for 30027: image size reported as -1 in v1.12 client against v1.13 daemon. // This test checks to make sure both v1.12 and v1.13 client against v1.13 daemon get correct `Size` after the fix. func (s *DockerSuite) TestAPIImagesSizeCompatibility(c *check.C) { status, b, err := request.SockRequest("GET", "/images/json", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) var images []types.ImageSummary err = json.Unmarshal(b, &images) c.Assert(err, checker.IsNil) c.Assert(len(images), checker.Not(checker.Equals), 0) for _, image := range images { c.Assert(image.Size, checker.Not(checker.Equals), int64(-1)) } type v124Image struct { ID string `json:"Id"` ParentID string `json:"ParentId"` RepoTags []string RepoDigests []string Created int64 Size int64 VirtualSize int64 Labels map[string]string } status, b, err = request.SockRequest("GET", "/v1.24/images/json", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) var v124Images []v124Image err = json.Unmarshal(b, &v124Images) c.Assert(err, checker.IsNil) c.Assert(len(v124Images), checker.Not(checker.Equals), 0) for _, image := range v124Images { c.Assert(image.Size, checker.Not(checker.Equals), int64(-1)) } }
func (s *DockerSuite) TestLogsSinceFutureFollow(c *check.C) { // TODO Windows TP5 - Figure out why this test is so flakey. Disabled for now. testRequires(c, DaemonIsLinux) name := "testlogssincefuturefollow" out, _ := dockerCmd(c, "run", "-d", "--name", name, "busybox", "/bin/sh", "-c", `for i in $(seq 1 5); do echo log$i; sleep 1; done`) // Extract one timestamp from the log file to give us a starting point for // our `--since` argument. Because the log producer runs in the background, // we need to check repeatedly for some output to be produced. var timestamp string for i := 0; i != 100 && timestamp == ""; i++ { if out, _ = dockerCmd(c, "logs", "-t", name); out == "" { time.Sleep(time.Millisecond * 100) // Retry } else { timestamp = strings.Split(strings.Split(out, "\n")[0], " ")[0] } } c.Assert(timestamp, checker.Not(checker.Equals), "") t, err := time.Parse(time.RFC3339Nano, timestamp) c.Assert(err, check.IsNil) since := t.Unix() + 2 out, _ = dockerCmd(c, "logs", "-t", "-f", fmt.Sprintf("--since=%v", since), name) c.Assert(out, checker.Not(checker.HasLen), 0, check.Commentf("cannot read from empty log")) lines := strings.Split(strings.TrimSpace(out), "\n") for _, v := range lines { ts, err := time.Parse(time.RFC3339Nano, strings.Split(v, " ")[0]) c.Assert(err, checker.IsNil, check.Commentf("cannot parse timestamp output from log: '%v'", v)) c.Assert(ts.Unix() >= since, checker.Equals, true, check.Commentf("earlier log found. since=%v logdate=%v", since, ts)) } }
func (s *DockerSuite) TestEventsFilterImageName(c *check.C) { since := daemonUnixTime(c) out, _ := dockerCmd(c, "run", "--name", "container_1", "-d", "busybox:latest", "true") container1 := strings.TrimSpace(out) out, _ = dockerCmd(c, "run", "--name", "container_2", "-d", "busybox", "true") container2 := strings.TrimSpace(out) name := "busybox" out, _ = dockerCmd(c, "events", "--since", since, "--until", daemonUnixTime(c), "--filter", fmt.Sprintf("image=%s", name)) events := strings.Split(out, "\n") events = events[:len(events)-1] c.Assert(events, checker.Not(checker.HasLen), 0) //Expected events but found none for the image busybox:latest count1 := 0 count2 := 0 for _, e := range events { if strings.Contains(e, container1) { count1++ } else if strings.Contains(e, container2) { count2++ } } c.Assert(count1, checker.Not(checker.Equals), 0, check.Commentf("Expected event from container but got %d from %s", count1, container1)) c.Assert(count2, checker.Not(checker.Equals), 0, check.Commentf("Expected event from container but got %d from %s", count2, container2)) }
func (s *DockerSwarmSuite) TestServiceCreateWithSecretSourceTarget(c *check.C) { d := s.AddDaemon(c, true, true) serviceName := "test-service-secret" testName := "test_secret" id := d.CreateSecret(c, swarm.SecretSpec{ swarm.Annotations{ Name: testName, }, []byte("TESTINGDATA"), }) c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) testTarget := "testing" out, err := d.Cmd("service", "create", "--name", serviceName, "--secret", fmt.Sprintf("source=%s,target=%s", testName, testTarget), "busybox", "top") c.Assert(err, checker.IsNil, check.Commentf(out)) out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", serviceName) c.Assert(err, checker.IsNil) var refs []swarm.SecretReference c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil) c.Assert(refs, checker.HasLen, 1) c.Assert(refs[0].SecretName, checker.Equals, testName) c.Assert(refs[0].File, checker.Not(checker.IsNil)) c.Assert(refs[0].File.Name, checker.Equals, testTarget) }
func (s *DockerSuite) TestSaveLoadNoTag(c *check.C) { testRequires(c, DaemonIsLinux) name := "saveloadnotag" _, err := buildImage(name, "FROM busybox\nENV foo=bar", true) c.Assert(err, checker.IsNil, check.Commentf("%v", err)) id := inspectField(c, name, "Id") // Test to make sure that save w/o name just shows imageID during load out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", id), exec.Command(dockerBinary, "load")) c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) // Should not show 'name' but should show the image ID during the load c.Assert(out, checker.Not(checker.Contains), "Loaded image: ") c.Assert(out, checker.Contains, "Loaded image ID:") c.Assert(out, checker.Contains, id) // Test to make sure that save by name shows that name during load out, _, err = testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", name), exec.Command(dockerBinary, "load")) c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) c.Assert(out, checker.Contains, "Loaded image: "+name+":latest") c.Assert(out, checker.Not(checker.Contains), "Loaded image ID:") }
func (s *DockerDaemonSuite) TestPruneImageDangling(c *check.C) { s.d.StartWithBusybox(c) out, _, err := s.d.BuildImageWithOut("test", `FROM busybox LABEL foo=bar`, true, "-q") c.Assert(err, checker.IsNil) id := strings.TrimSpace(out) out, err = s.d.Cmd("images", "-q", "--no-trunc") c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Contains, id) out, err = s.d.Cmd("image", "prune", "--force") c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id) out, err = s.d.Cmd("images", "-q", "--no-trunc") c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Contains, id) out, err = s.d.Cmd("image", "prune", "--force", "--all") c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Contains, id) out, err = s.d.Cmd("images", "-q", "--no-trunc") c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id) }
// test case for #23055 func (s *DockerSuite) TestSearchWithLimit(c *check.C) { testRequires(c, Network, DaemonIsLinux) limit := 10 out, _, err := dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") c.Assert(err, checker.IsNil) outSlice := strings.Split(out, "\n") c.Assert(outSlice, checker.HasLen, limit+2) // 1 header, 1 carriage return limit = 50 out, _, err = dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") c.Assert(err, checker.IsNil) outSlice = strings.Split(out, "\n") c.Assert(outSlice, checker.HasLen, limit+2) // 1 header, 1 carriage return limit = 100 out, _, err = dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") c.Assert(err, checker.IsNil) outSlice = strings.Split(out, "\n") c.Assert(outSlice, checker.HasLen, limit+2) // 1 header, 1 carriage return limit = 0 out, _, err = dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") c.Assert(err, checker.Not(checker.IsNil)) limit = 200 out, _, err = dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") c.Assert(err, checker.Not(checker.IsNil)) }
func (s *DockerSuite) TestPsByOrder(c *check.C) { name1 := "xyz-abc" out, err := runSleepingContainer(c, "--name", name1) c.Assert(err, checker.NotNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") container1 := strings.TrimSpace(out) name2 := "xyz-123" out, err = runSleepingContainer(c, "--name", name2) c.Assert(err, checker.NotNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") container2 := strings.TrimSpace(out) name3 := "789-abc" out, err = runSleepingContainer(c, "--name", name3) c.Assert(err, checker.NotNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") name4 := "789-123" out, err = runSleepingContainer(c, "--name", name4) c.Assert(err, checker.NotNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") // Run multiple time should have the same result out, err = dockerCmd(c, "ps", "--no-trunc", "-q", "-f", "name=xyz") c.Assert(err, checker.NotNil) c.Assert(strings.TrimSpace(out), checker.Equals, fmt.Sprintf("%s\n%s", container2, container1)) // Run multiple time should have the same result out, err = dockerCmd(c, "ps", "--no-trunc", "-q", "-f", "name=xyz") c.Assert(err, checker.NotNil) c.Assert(strings.TrimSpace(out), checker.Equals, fmt.Sprintf("%s\n%s", container2, container1)) }
func (s *DockerSwarmSuite) TestSecretCreateWithFile(c *check.C) { d := s.AddDaemon(c, true, true) testFile, err := ioutil.TempFile("", "secretCreateTest") c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file")) defer os.Remove(testFile.Name()) testData := "TESTINGDATA" _, err = testFile.Write([]byte(testData)) c.Assert(err, checker.IsNil, check.Commentf("failed to write to temporary file")) testName := "test_secret" out, err := d.Cmd("secret", "create", "--file", testFile.Name(), testName) c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "", check.Commentf(out)) id := strings.TrimSpace(out) secret := d.GetSecret(c, id) c.Assert(secret.Spec.Name, checker.Equals, testName) testName = "test_secret_2" out, err = d.Cmd("secret", "create", testName, "-f", testFile.Name()) c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "", check.Commentf(out)) id = strings.TrimSpace(out) secret = d.GetSecret(c, id) c.Assert(secret.Spec.Name, checker.Equals, testName) }
func (s *DockerSuite) TestInspectStopWhenNotFound(c *check.C) { runSleepingContainer(c, "--name=busybox", "-d") runSleepingContainer(c, "--name=not-shown", "-d") out, _, err := dockerCmdWithError("inspect", "--type=container", "--format='{{.Name}}'", "busybox", "missing", "not-shown") c.Assert(err, checker.Not(check.IsNil)) c.Assert(out, checker.Contains, "busybox") c.Assert(out, checker.Not(checker.Contains), "not-shown") c.Assert(out, checker.Contains, "Error: No such container: missing") }
func (s *DockerDaemonSuite) TestDaemonEventsWithFilters(c *check.C) { testRequires(c, SameHostDaemon, DaemonIsLinux) // daemon config file configFilePath := "test.json" configFile, err := os.Create(configFilePath) c.Assert(err, checker.IsNil) defer os.Remove(configFilePath) daemonConfig := `{"labels":["foo=bar"]}` fmt.Fprintf(configFile, "%s", daemonConfig) configFile.Close() s.d.Start(c, fmt.Sprintf("--config-file=%s", configFilePath)) // Get daemon ID out, err := s.d.Cmd("info") c.Assert(err, checker.IsNil) daemonID := "" daemonName := "" for _, line := range strings.Split(out, "\n") { if strings.HasPrefix(line, "ID: ") { daemonID = strings.TrimPrefix(line, "ID: ") } else if strings.HasPrefix(line, "Name: ") { daemonName = strings.TrimPrefix(line, "Name: ") } } c.Assert(daemonID, checker.Not(checker.Equals), "") c.Assert(s.d.Signal(syscall.SIGHUP), checker.IsNil) time.Sleep(3 * time.Second) out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", fmt.Sprintf("daemon=%s", daemonID)) c.Assert(err, checker.IsNil) c.Assert(out, checker.Contains, fmt.Sprintf("daemon reload %s", daemonID)) out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", fmt.Sprintf("daemon=%s", daemonName)) c.Assert(err, checker.IsNil) c.Assert(out, checker.Contains, fmt.Sprintf("daemon reload %s", daemonID)) out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", "daemon=foo") c.Assert(err, checker.IsNil) c.Assert(out, checker.Not(checker.Contains), fmt.Sprintf("daemon reload %s", daemonID)) out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", "type=daemon") c.Assert(err, checker.IsNil) c.Assert(out, checker.Contains, fmt.Sprintf("daemon reload %s", daemonID)) out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", "type=container") c.Assert(err, checker.IsNil) c.Assert(out, checker.Not(checker.Contains), fmt.Sprintf("daemon reload %s", daemonID)) }
func (s *DockerSuite) TestPluginIDPrefix(c *check.C) { testRequires(c, DaemonIsLinux, Network) _, _, err := dockerCmdWithError("plugin", "install", "--disable", "--grant-all-permissions", pNameWithTag) c.Assert(err, checker.IsNil) // Find ID first id, _, err := dockerCmdWithError("plugin", "inspect", "-f", "{{.Id}}", pNameWithTag) id = strings.TrimSpace(id) c.Assert(err, checker.IsNil) // List current state out, _, err := dockerCmdWithError("plugin", "ls") c.Assert(err, checker.IsNil) c.Assert(out, checker.Contains, pName) c.Assert(out, checker.Contains, pTag) c.Assert(out, checker.Contains, "false") env, _ := dockerCmd(c, "plugin", "inspect", "-f", "{{.Settings.Env}}", id[:5]) c.Assert(strings.TrimSpace(env), checker.Equals, "[DEBUG=0]") dockerCmd(c, "plugin", "set", id[:5], "DEBUG=1") env, _ = dockerCmd(c, "plugin", "inspect", "-f", "{{.Settings.Env}}", id[:5]) c.Assert(strings.TrimSpace(env), checker.Equals, "[DEBUG=1]") // Enable _, _, err = dockerCmdWithError("plugin", "enable", id[:5]) c.Assert(err, checker.IsNil) out, _, err = dockerCmdWithError("plugin", "ls") c.Assert(err, checker.IsNil) c.Assert(out, checker.Contains, pName) c.Assert(out, checker.Contains, pTag) c.Assert(out, checker.Contains, "true") // Disable _, _, err = dockerCmdWithError("plugin", "disable", id[:5]) c.Assert(err, checker.IsNil) out, _, err = dockerCmdWithError("plugin", "ls") c.Assert(err, checker.IsNil) c.Assert(out, checker.Contains, pName) c.Assert(out, checker.Contains, pTag) c.Assert(out, checker.Contains, "false") // Remove out, _, err = dockerCmdWithError("plugin", "remove", id[:5]) c.Assert(err, checker.IsNil) // List returns none out, _, err = dockerCmdWithError("plugin", "ls") c.Assert(err, checker.IsNil) c.Assert(out, checker.Not(checker.Contains), pName) c.Assert(out, checker.Not(checker.Contains), pTag) }
func (s *DockerSuite) TestLinksPingLinkedContainersOnRename(c *check.C) { // Problematic on Windows as Windows does not support links testRequires(c, DaemonIsLinux) var out string out, _ = dockerCmd(c, "run", "-d", "--name", "container1", "busybox", "top") idA := strings.TrimSpace(out) c.Assert(idA, checker.Not(checker.Equals), "", check.Commentf("%s, id should not be nil", out)) out, _ = dockerCmd(c, "run", "-d", "--link", "container1:alias1", "--name", "container2", "busybox", "top") idB := strings.TrimSpace(out) c.Assert(idB, checker.Not(checker.Equals), "", check.Commentf("%s, id should not be nil", out)) dockerCmd(c, "exec", "container2", "ping", "-c", "1", "alias1", "-W", "1") dockerCmd(c, "rename", "container1", "container_new") dockerCmd(c, "exec", "container2", "ping", "-c", "1", "alias1", "-W", "1") }
// Can't use localhost here since go has a special case to not use proxy if connecting to localhost // See https://golang.org/pkg/net/http/#ProxyFromEnvironment func (s *DockerDaemonSuite) TestCLIProxyProxyTCPSock(c *check.C) { testRequires(c, SameHostDaemon) // get the IP to use to connect since we can't use localhost addrs, err := net.InterfaceAddrs() c.Assert(err, checker.IsNil) var ip string for _, addr := range addrs { sAddr := addr.String() if !strings.Contains(sAddr, "127.0.0.1") { addrArr := strings.Split(sAddr, "/") ip = addrArr[0] break } } c.Assert(ip, checker.Not(checker.Equals), "") s.d.Start(c, "-H", "tcp://"+ip+":2375") icmd.RunCmd(icmd.Cmd{ Command: []string{dockerBinary, "info"}, Env: []string{"DOCKER_HOST=tcp://" + ip + ":2375", "HTTP_PROXY=127.0.0.1:9999"}, }).Assert(c, icmd.Expected{Error: "exit status 1", ExitCode: 1}) // Test with no_proxy icmd.RunCmd(icmd.Cmd{ Command: []string{dockerBinary, "info"}, Env: []string{"DOCKER_HOST=tcp://" + ip + ":2375", "HTTP_PROXY=127.0.0.1:9999", "NO_PROXY=" + ip}, }).Assert(c, icmd.Success) }
func (s *DockerSwarmSuite) TestServiceLogs(c *check.C) { testRequires(c, ExperimentalDaemon) d := s.AddDaemon(c, true, true) // we have multiple services here for detecting the goroutine issue #28915 services := map[string]string{ "TestServiceLogs1": "hello1", "TestServiceLogs2": "hello2", } for name, message := range services { out, err := d.Cmd("service", "create", "--name", name, "busybox", "sh", "-c", fmt.Sprintf("echo %s; tail -f /dev/null", message)) c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") } // make sure task has been deployed. waitAndAssert(c, defaultReconciliationTimeout, d.CheckActiveContainerCount, checker.Equals, len(services)) for name, message := range services { out, err := d.Cmd("service", "logs", name) c.Assert(err, checker.IsNil) c.Logf("log for %q: %q", name, out) c.Assert(out, checker.Contains, message) } }
// TestPullScratchNotAllowed verifies that pulling 'scratch' is rejected. func (s *DockerHubPullSuite) TestPullScratchNotAllowed(c *check.C) { testRequires(c, DaemonIsLinux) out, err := s.CmdWithError("pull", "scratch") c.Assert(err, checker.NotNil, check.Commentf("expected pull of scratch to fail")) c.Assert(out, checker.Contains, "'scratch' is a reserved name") c.Assert(out, checker.Not(checker.Contains), "Pulling repository scratch") }
// TestPullAllTagsFromCentralRegistry pulls using `all-tags` for a given image and verifies that it // results in more images than a naked pull. func (s *DockerHubPullSuite) TestPullAllTagsFromCentralRegistry(c *check.C) { testRequires(c, DaemonIsLinux) s.Cmd(c, "pull", "busybox") outImageCmd := s.Cmd(c, "images", "busybox") splitOutImageCmd := strings.Split(strings.TrimSpace(outImageCmd), "\n") c.Assert(splitOutImageCmd, checker.HasLen, 2, check.Commentf("expected a single entry in images\n%v", outImageCmd)) s.Cmd(c, "pull", "--all-tags=true", "busybox") outImageAllTagCmd := s.Cmd(c, "images", "busybox") if linesCount := strings.Count(outImageAllTagCmd, "\n"); linesCount <= 2 { c.Fatalf("pulling all tags should provide more images, got %d", linesCount-1) } // Verify that the line for 'busybox:latest' is left unchanged. var latestLine string for _, line := range strings.Split(outImageAllTagCmd, "\n") { if strings.HasPrefix(line, "busybox") && strings.Contains(line, "latest") { latestLine = line break } } c.Assert(latestLine, checker.Not(checker.Equals), "", check.Commentf("no entry for busybox:latest found after pulling all tags")) splitLatest := strings.Fields(latestLine) splitCurrent := strings.Fields(splitOutImageCmd[1]) c.Assert(splitLatest, checker.DeepEquals, splitCurrent, check.Commentf("busybox:latest was changed after pulling all tags")) }
func (s *DockerSwarmSuite) TestSecretInspectMultiple(c *check.C) { d := s.AddDaemon(c, true, true) testNames := []string{ "test0", "test1", } for _, n := range testNames { id := d.CreateSecret(c, swarm.SecretSpec{ swarm.Annotations{ Name: n, }, []byte("TESTINGDATA"), }) c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) secret := d.GetSecret(c, id) c.Assert(secret.Spec.Name, checker.Equals, n) } args := []string{ "secret", "inspect", } args = append(args, testNames...) out, err := d.Cmd(args...) c.Assert(err, checker.IsNil, check.Commentf(out)) var secrets []swarm.Secret c.Assert(json.Unmarshal([]byte(out), &secrets), checker.IsNil) c.Assert(secrets, checker.HasLen, 2) }
func (s *DockerRegistryAuthHtpasswdSuite) TestPullWithExternalAuth(c *check.C) { osPath := os.Getenv("PATH") defer os.Setenv("PATH", osPath) workingDir, err := os.Getwd() c.Assert(err, checker.IsNil) absolute, err := filepath.Abs(filepath.Join(workingDir, "fixtures", "auth")) c.Assert(err, checker.IsNil) testPath := fmt.Sprintf("%s%c%s", osPath, filepath.ListSeparator, absolute) os.Setenv("PATH", testPath) repoName := fmt.Sprintf("%v/dockercli/busybox:authtest", privateRegistryURL) tmp, err := ioutil.TempDir("", "integration-cli-") c.Assert(err, checker.IsNil) externalAuthConfig := `{ "credsStore": "shell-test" }` configPath := filepath.Join(tmp, "config.json") err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) c.Assert(err, checker.IsNil) dockerCmd(c, "--config", tmp, "login", "-u", s.reg.Username(), "-p", s.reg.Password(), privateRegistryURL) b, err := ioutil.ReadFile(configPath) c.Assert(err, checker.IsNil) c.Assert(string(b), checker.Not(checker.Contains), "\"auth\":") dockerCmd(c, "--config", tmp, "tag", "busybox", repoName) dockerCmd(c, "--config", tmp, "push", repoName) dockerCmd(c, "--config", tmp, "pull", repoName) }
func (s *DockerSuite) TestImagesEnsureDanglingImageOnlyListedOnce(c *check.C) { testRequires(c, DaemonIsLinux) // create container 1 out, _ := dockerCmd(c, "run", "-d", "busybox", "true") containerID1 := strings.TrimSpace(out) // tag as foobox out, _ = dockerCmd(c, "commit", containerID1, "foobox") imageID := stringid.TruncateID(strings.TrimSpace(out)) // overwrite the tag, making the previous image dangling dockerCmd(c, "tag", "busybox", "foobox") out, _ = dockerCmd(c, "images", "-q", "-f", "dangling=true") // Expect one dangling image c.Assert(strings.Count(out, imageID), checker.Equals, 1) out, _ = dockerCmd(c, "images", "-q", "-f", "dangling=false") //dangling=false would not include dangling images c.Assert(out, checker.Not(checker.Contains), imageID) out, _ = dockerCmd(c, "images") //docker images still include dangling images c.Assert(out, checker.Contains, imageID) }
// ensure tags cannot create ambiguity with image ids func (s *DockerSuite) TestTagTruncationAmbiguity(c *check.C) { imageID, err := buildImage("notbusybox:latest", `FROM busybox MAINTAINER dockerio`, true) if err != nil { c.Fatal(err) } truncatedImageID := stringid.TruncateID(imageID) truncatedTag := fmt.Sprintf("notbusybox:%s", truncatedImageID) id := inspectField(c, truncatedTag, "Id") // Ensure inspect by image id returns image for image id c.Assert(id, checker.Equals, imageID) c.Logf("Built image: %s", imageID) // test setting tag fails _, _, err = dockerCmdWithError("tag", "busybox:latest", truncatedTag) if err != nil { c.Fatalf("Error tagging with an image id: %s", err) } id = inspectField(c, truncatedTag, "Id") // Ensure id is imageID and not busybox:latest c.Assert(id, checker.Not(checker.Equals), imageID) }
// Can't use localhost here since go has a special case to not use proxy if connecting to localhost // See https://golang.org/pkg/net/http/#ProxyFromEnvironment func (s *DockerDaemonSuite) TestCLIProxyProxyTCPSock(c *check.C) { testRequires(c, SameHostDaemon) // get the IP to use to connect since we can't use localhost addrs, err := net.InterfaceAddrs() c.Assert(err, checker.IsNil) var ip string for _, addr := range addrs { sAddr := addr.String() if !strings.Contains(sAddr, "127.0.0.1") { addrArr := strings.Split(sAddr, "/") ip = addrArr[0] break } } c.Assert(ip, checker.Not(checker.Equals), "") s.d.Start(c, "-H", "tcp://"+ip+":2375") cmd := exec.Command(dockerBinary, "info") cmd.Env = []string{"DOCKER_HOST=tcp://" + ip + ":2375", "HTTP_PROXY=127.0.0.1:9999"} out, _, err := runCommandWithOutput(cmd) c.Assert(err, checker.NotNil, check.Commentf("%v", out)) // Test with no_proxy cmd.Env = append(cmd.Env, "NO_PROXY="+ip) out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "info")) c.Assert(err, checker.IsNil, check.Commentf("%v", out)) }
func (s *DockerSuite) TestLogsSince(c *check.C) { name := "testlogssince" dockerCmd(c, "run", "--name="+name, "busybox", "/bin/sh", "-c", "for i in $(seq 1 3); do sleep 2; echo log$i; done") out, _ := dockerCmd(c, "logs", "-t", name) log2Line := strings.Split(strings.Split(out, "\n")[1], " ") t, err := time.Parse(time.RFC3339Nano, log2Line[0]) // the timestamp log2 is written c.Assert(err, checker.IsNil) since := t.Unix() + 1 // add 1s so log1 & log2 doesn't show up out, _ = dockerCmd(c, "logs", "-t", fmt.Sprintf("--since=%v", since), name) // Skip 2 seconds unexpected := []string{"log1", "log2"} for _, v := range unexpected { c.Assert(out, checker.Not(checker.Contains), v, check.Commentf("unexpected log message returned, since=%v", since)) } // Test to make sure a bad since format is caught by the client out, _, _ = dockerCmdWithError("logs", "-t", "--since=2006-01-02T15:04:0Z", name) c.Assert(out, checker.Contains, "cannot parse \"0Z\" as \"05\"", check.Commentf("bad since format passed to server")) // Test with default value specified and parameter omitted expected := []string{"log1", "log2", "log3"} for _, cmd := range []*exec.Cmd{ exec.Command(dockerBinary, "logs", "-t", name), exec.Command(dockerBinary, "logs", "-t", "--since=0", name), } { out, _, err = runCommandWithOutput(cmd) c.Assert(err, checker.IsNil, check.Commentf("failed to log container: %s", out)) for _, v := range expected { c.Assert(out, checker.Contains, v) } } }
func (s *DockerSuite) TestEventsFilterLabels(c *check.C) { since := daemonUnixTime(c) label := "io.docker.testing=foo" out, _ := dockerCmd(c, "run", "-d", "-l", label, "busybox:latest", "true") container1 := strings.TrimSpace(out) out, _ = dockerCmd(c, "run", "-d", "busybox", "true") container2 := strings.TrimSpace(out) out, _ = dockerCmd( c, "events", "--since", since, "--until", daemonUnixTime(c), "--filter", fmt.Sprintf("label=%s", label)) events := strings.Split(strings.TrimSpace(out), "\n") c.Assert(len(events), checker.Equals, 3) for _, e := range events { c.Assert(e, checker.Contains, container1) c.Assert(e, checker.Not(checker.Contains), container2) } }
func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverMountID(c *check.C) { s.d.StartWithBusybox(c) out, err := s.d.Cmd("run", "--rm", "-v", "external-volume-test:/tmp/external-volume-test", "--volume-driver", volumePluginName, "busybox:latest", "cat", "/tmp/external-volume-test/test") c.Assert(err, checker.IsNil, check.Commentf(out)) c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") }
func (s *DockerSuite) TestPsListContainersFilterCreated(c *check.C) { // create a container out, _ := dockerCmd(c, "create", "busybox") cID := strings.TrimSpace(out) shortCID := cID[:12] // Make sure it DOESN'T show up w/o a '-a' for normal 'ps' out, _ = dockerCmd(c, "ps", "-q") c.Assert(out, checker.Not(checker.Contains), shortCID, check.Commentf("Should have not seen '%s' in ps output:\n%s", shortCID, out)) // Make sure it DOES show up as 'Created' for 'ps -a' out, _ = dockerCmd(c, "ps", "-a") hits := 0 for _, line := range strings.Split(out, "\n") { if !strings.Contains(line, shortCID) { continue } hits++ c.Assert(line, checker.Contains, "Created", check.Commentf("Missing 'Created' on '%s'", line)) } c.Assert(hits, checker.Equals, 1, check.Commentf("Should have seen '%s' in ps -a output once:%d\n%s", shortCID, hits, out)) // filter containers by 'create' - note, no -a needed out, _ = dockerCmd(c, "ps", "-q", "-f", "status=created") containerOut := strings.TrimSpace(out) c.Assert(cID, checker.HasPrefix, containerOut) }
func (s *DockerSuite) TestBuildAPIDockerFileRemote(c *check.C) { testRequires(c, NotUserNamespace) var testD string if daemonPlatform == "windows" { testD = `FROM busybox COPY * /tmp/ RUN find / -name ba* RUN find /tmp/` } else { // -xdev is required because sysfs can cause EPERM testD = `FROM busybox COPY * /tmp/ RUN find / -xdev -name ba* RUN find /tmp/` } server, err := fakeStorage(map[string]string{"testD": testD}) c.Assert(err, checker.IsNil) defer server.Close() res, body, err := request.SockRequestRaw("POST", "/build?dockerfile=baz&remote="+server.URL()+"/testD", nil, "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusOK) buf, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) // Make sure Dockerfile exists. // Make sure 'baz' doesn't exist ANYWHERE despite being mentioned in the URL out := string(buf) c.Assert(out, checker.Contains, "/tmp/Dockerfile") c.Assert(out, checker.Not(checker.Contains), "baz") }
func (s *DockerSuite) TestExecWithPrivileged(c *check.C) { // Not applicable on Windows testRequires(c, DaemonIsLinux, NotUserNamespace) // Start main loop which attempts mknod repeatedly dockerCmd(c, "run", "-d", "--name", "parent", "--cap-drop=ALL", "busybox", "sh", "-c", `while (true); do if [ -e /exec_priv ]; then cat /exec_priv && mknod /tmp/sda b 8 0 && echo "Success"; else echo "Privileged exec has not run yet"; fi; usleep 10000; done`) // Check exec mknod doesn't work cmd := exec.Command(dockerBinary, "exec", "parent", "sh", "-c", "mknod /tmp/sdb b 8 16") out, _, err := runCommandWithOutput(cmd) c.Assert(err, checker.NotNil, check.Commentf("exec mknod in --cap-drop=ALL container without --privileged should fail")) c.Assert(out, checker.Contains, "Operation not permitted", check.Commentf("exec mknod in --cap-drop=ALL container without --privileged should fail")) // Check exec mknod does work with --privileged cmd = exec.Command(dockerBinary, "exec", "--privileged", "parent", "sh", "-c", `echo "Running exec --privileged" > /exec_priv && mknod /tmp/sdb b 8 16 && usleep 50000 && echo "Finished exec --privileged" > /exec_priv && echo ok`) out, _, err = runCommandWithOutput(cmd) c.Assert(err, checker.IsNil) actual := strings.TrimSpace(out) c.Assert(actual, checker.Equals, "ok", check.Commentf("exec mknod in --cap-drop=ALL container with --privileged failed, output: %q", out)) // Check subsequent unprivileged exec cannot mknod cmd = exec.Command(dockerBinary, "exec", "parent", "sh", "-c", "mknod /tmp/sdc b 8 32") out, _, err = runCommandWithOutput(cmd) c.Assert(err, checker.NotNil, check.Commentf("repeating exec mknod in --cap-drop=ALL container after --privileged without --privileged should fail")) c.Assert(out, checker.Contains, "Operation not permitted", check.Commentf("repeating exec mknod in --cap-drop=ALL container after --privileged without --privileged should fail")) // Confirm at no point was mknod allowed logCmd := exec.Command(dockerBinary, "logs", "parent") out, _, err = runCommandWithOutput(logCmd) c.Assert(err, checker.IsNil) c.Assert(out, checker.Not(checker.Contains), "Success") }
// Test case for 28884 func (s *DockerSwarmSuite) TestSecretCreateResolve(c *check.C) { d := s.AddDaemon(c, true, true) name := "test_secret" id := d.CreateSecret(c, swarm.SecretSpec{ swarm.Annotations{ Name: name, }, []byte("foo"), }) c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) fake := d.CreateSecret(c, swarm.SecretSpec{ swarm.Annotations{ Name: id, }, []byte("fake foo"), }) c.Assert(fake, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", fake)) out, err := d.Cmd("secret", "ls") c.Assert(err, checker.IsNil) c.Assert(out, checker.Contains, name) c.Assert(out, checker.Contains, fake) out, err = d.Cmd("secret", "rm", id) c.Assert(out, checker.Contains, id) // Fake one will remain out, err = d.Cmd("secret", "ls") c.Assert(err, checker.IsNil) c.Assert(out, checker.Not(checker.Contains), name) c.Assert(out, checker.Contains, fake) // Remove based on name prefix of the fake one // (which is the same as the ID of foo one) should not work // as search is only done based on: // - Full ID // - Full Name // - Partial ID (prefix) out, err = d.Cmd("secret", "rm", id[:5]) c.Assert(out, checker.Not(checker.Contains), id) out, err = d.Cmd("secret", "ls") c.Assert(err, checker.IsNil) c.Assert(out, checker.Not(checker.Contains), name) c.Assert(out, checker.Contains, fake) // Remove based on ID prefix of the fake one should succeed out, err = d.Cmd("secret", "rm", fake[:5]) c.Assert(out, checker.Contains, fake) out, err = d.Cmd("secret", "ls") c.Assert(err, checker.IsNil) c.Assert(out, checker.Not(checker.Contains), name) c.Assert(out, checker.Not(checker.Contains), id) c.Assert(out, checker.Not(checker.Contains), fake) }
func (s *DockerSuite) TestRmiBlank(c *check.C) { out, _, err := dockerCmdWithError("rmi", " ") // Should have failed to delete ' ' image c.Assert(err, checker.NotNil) // Wrong error message generated c.Assert(out, checker.Not(checker.Contains), "no such id", check.Commentf("out: %s", out)) // Expected error message not generated c.Assert(out, checker.Contains, "image name cannot be blank", check.Commentf("out: %s", out)) }