github.com/walkingsparrow/docker@v1.4.2-0.20151218153551-b708a2249bfa/integration-cli/docker_cli_images_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "reflect" 6 "sort" 7 "strings" 8 "time" 9 10 "github.com/docker/docker/pkg/integration/checker" 11 "github.com/docker/docker/pkg/stringid" 12 "github.com/go-check/check" 13 ) 14 15 func (s *DockerSuite) TestImagesEnsureImageIsListed(c *check.C) { 16 testRequires(c, DaemonIsLinux) 17 imagesOut, _ := dockerCmd(c, "images") 18 c.Assert(imagesOut, checker.Contains, "busybox") 19 } 20 21 func (s *DockerSuite) TestImagesEnsureImageWithTagIsListed(c *check.C) { 22 testRequires(c, DaemonIsLinux) 23 24 name := "imagewithtag" 25 dockerCmd(c, "tag", "busybox", name+":v1") 26 dockerCmd(c, "tag", "busybox", name+":v1v1") 27 dockerCmd(c, "tag", "busybox", name+":v2") 28 29 imagesOut, _ := dockerCmd(c, "images", name+":v1") 30 c.Assert(imagesOut, checker.Contains, name) 31 c.Assert(imagesOut, checker.Contains, "v1") 32 c.Assert(imagesOut, checker.Not(checker.Contains), "v2") 33 c.Assert(imagesOut, checker.Not(checker.Contains), "v1v1") 34 35 imagesOut, _ = dockerCmd(c, "images", name) 36 c.Assert(imagesOut, checker.Contains, name) 37 c.Assert(imagesOut, checker.Contains, "v1") 38 c.Assert(imagesOut, checker.Contains, "v1v1") 39 c.Assert(imagesOut, checker.Contains, "v2") 40 } 41 42 func (s *DockerSuite) TestImagesEnsureImageWithBadTagIsNotListed(c *check.C) { 43 imagesOut, _ := dockerCmd(c, "images", "busybox:nonexistent") 44 c.Assert(imagesOut, checker.Not(checker.Contains), "busybox") 45 } 46 47 func (s *DockerSuite) TestImagesOrderedByCreationDate(c *check.C) { 48 testRequires(c, DaemonIsLinux) 49 id1, err := buildImage("order:test_a", 50 `FROM scratch 51 MAINTAINER dockerio1`, true) 52 c.Assert(err, checker.IsNil) 53 time.Sleep(1 * time.Second) 54 id2, err := buildImage("order:test_c", 55 `FROM scratch 56 MAINTAINER dockerio2`, true) 57 c.Assert(err, checker.IsNil) 58 time.Sleep(1 * time.Second) 59 id3, err := buildImage("order:test_b", 60 `FROM scratch 61 MAINTAINER dockerio3`, true) 62 c.Assert(err, checker.IsNil) 63 64 out, _ := dockerCmd(c, "images", "-q", "--no-trunc") 65 imgs := strings.Split(out, "\n") 66 c.Assert(imgs[0], checker.Equals, id3, check.Commentf("First image must be %s, got %s", id3, imgs[0])) 67 c.Assert(imgs[1], checker.Equals, id2, check.Commentf("First image must be %s, got %s", id2, imgs[1])) 68 c.Assert(imgs[2], checker.Equals, id1, check.Commentf("First image must be %s, got %s", id1, imgs[2])) 69 } 70 71 func (s *DockerSuite) TestImagesErrorWithInvalidFilterNameTest(c *check.C) { 72 out, _, err := dockerCmdWithError("images", "-f", "FOO=123") 73 c.Assert(err, checker.NotNil) 74 c.Assert(out, checker.Contains, "Invalid filter") 75 } 76 77 func (s *DockerSuite) TestImagesFilterLabelMatch(c *check.C) { 78 testRequires(c, DaemonIsLinux) 79 imageName1 := "images_filter_test1" 80 imageName2 := "images_filter_test2" 81 imageName3 := "images_filter_test3" 82 image1ID, err := buildImage(imageName1, 83 `FROM scratch 84 LABEL match me`, true) 85 c.Assert(err, check.IsNil) 86 87 image2ID, err := buildImage(imageName2, 88 `FROM scratch 89 LABEL match="me too"`, true) 90 c.Assert(err, check.IsNil) 91 92 image3ID, err := buildImage(imageName3, 93 `FROM scratch 94 LABEL nomatch me`, true) 95 c.Assert(err, check.IsNil) 96 97 out, _ := dockerCmd(c, "images", "--no-trunc", "-q", "-f", "label=match") 98 out = strings.TrimSpace(out) 99 c.Assert(out, check.Matches, fmt.Sprintf("[\\s\\w:]*%s[\\s\\w:]*", image1ID)) 100 c.Assert(out, check.Matches, fmt.Sprintf("[\\s\\w:]*%s[\\s\\w:]*", image2ID)) 101 c.Assert(out, check.Not(check.Matches), fmt.Sprintf("[\\s\\w:]*%s[\\s\\w:]*", image3ID)) 102 103 out, _ = dockerCmd(c, "images", "--no-trunc", "-q", "-f", "label=match=me too") 104 out = strings.TrimSpace(out) 105 c.Assert(out, check.Equals, image2ID) 106 } 107 108 // Regression : #15659 109 func (s *DockerSuite) TestImagesFilterLabelWithCommit(c *check.C) { 110 // Create a container 111 dockerCmd(c, "run", "--name", "bar", "busybox", "/bin/sh") 112 // Commit with labels "using changes" 113 out, _ := dockerCmd(c, "commit", "-c", "LABEL foo.version=1.0.0-1", "-c", "LABEL foo.name=bar", "-c", "LABEL foo.author=starlord", "bar", "bar:1.0.0-1") 114 imageID := strings.TrimSpace(out) 115 116 out, _ = dockerCmd(c, "images", "--no-trunc", "-q", "-f", "label=foo.version=1.0.0-1") 117 out = strings.TrimSpace(out) 118 c.Assert(out, check.Equals, imageID) 119 } 120 121 func (s *DockerSuite) TestImagesFilterSpaceTrimCase(c *check.C) { 122 testRequires(c, DaemonIsLinux) 123 imageName := "images_filter_test" 124 buildImage(imageName, 125 `FROM scratch 126 RUN touch /test/foo 127 RUN touch /test/bar 128 RUN touch /test/baz`, true) 129 130 filters := []string{ 131 "dangling=true", 132 "Dangling=true", 133 " dangling=true", 134 "dangling=true ", 135 "dangling = true", 136 } 137 138 imageListings := make([][]string, 5, 5) 139 for idx, filter := range filters { 140 out, _ := dockerCmd(c, "images", "-q", "-f", filter) 141 listing := strings.Split(out, "\n") 142 sort.Strings(listing) 143 imageListings[idx] = listing 144 } 145 146 for idx, listing := range imageListings { 147 if idx < 4 && !reflect.DeepEqual(listing, imageListings[idx+1]) { 148 for idx, errListing := range imageListings { 149 fmt.Printf("out %d", idx) 150 for _, image := range errListing { 151 fmt.Print(image) 152 } 153 fmt.Print("") 154 } 155 c.Fatalf("All output must be the same") 156 } 157 } 158 } 159 160 func (s *DockerSuite) TestImagesEnsureDanglingImageOnlyListedOnce(c *check.C) { 161 testRequires(c, DaemonIsLinux) 162 // create container 1 163 out, _ := dockerCmd(c, "run", "-d", "busybox", "true") 164 containerID1 := strings.TrimSpace(out) 165 166 // tag as foobox 167 out, _ = dockerCmd(c, "commit", containerID1, "foobox") 168 imageID := stringid.TruncateID(strings.TrimSpace(out)) 169 170 // overwrite the tag, making the previous image dangling 171 dockerCmd(c, "tag", "-f", "busybox", "foobox") 172 173 out, _ = dockerCmd(c, "images", "-q", "-f", "dangling=true") 174 // Expect one dangling image 175 c.Assert(strings.Count(out, imageID), checker.Equals, 1) 176 } 177 178 func (s *DockerSuite) TestImagesWithIncorrectFilter(c *check.C) { 179 out, _, err := dockerCmdWithError("images", "-f", "dangling=invalid") 180 c.Assert(err, check.NotNil) 181 c.Assert(out, checker.Contains, "Invalid filter") 182 } 183 184 func (s *DockerSuite) TestImagesEnsureOnlyHeadsImagesShown(c *check.C) { 185 testRequires(c, DaemonIsLinux) 186 187 dockerfile := ` 188 FROM scratch 189 MAINTAINER docker 190 ENV foo bar` 191 192 head, out, err := buildImageWithOut("scratch-image", dockerfile, false) 193 c.Assert(err, check.IsNil) 194 195 // this is just the output of docker build 196 // we're interested in getting the image id of the MAINTAINER instruction 197 // and that's located at output, line 5, from 7 to end 198 split := strings.Split(out, "\n") 199 intermediate := strings.TrimSpace(split[5][7:]) 200 201 out, _ = dockerCmd(c, "images") 202 // images shouldn't show non-heads images 203 c.Assert(out, checker.Not(checker.Contains), intermediate) 204 // images should contain final built images 205 c.Assert(out, checker.Contains, stringid.TruncateID(head)) 206 } 207 208 func (s *DockerSuite) TestImagesEnsureImagesFromScratchShown(c *check.C) { 209 testRequires(c, DaemonIsLinux) 210 211 dockerfile := ` 212 FROM scratch 213 MAINTAINER docker` 214 215 id, _, err := buildImageWithOut("scratch-image", dockerfile, false) 216 c.Assert(err, check.IsNil) 217 218 out, _ := dockerCmd(c, "images") 219 // images should contain images built from scratch 220 c.Assert(out, checker.Contains, stringid.TruncateID(id)) 221 } 222 223 // #18181 224 func (s *DockerSuite) TestImagesFilterNameWithPort(c *check.C) { 225 tag := "a.b.c.d:5000/hello" 226 dockerCmd(c, "tag", "busybox", tag) 227 out, _ := dockerCmd(c, "images", tag) 228 c.Assert(out, checker.Contains, tag) 229 230 out, _ = dockerCmd(c, "images", tag+":latest") 231 c.Assert(out, checker.Contains, tag) 232 233 out, _ = dockerCmd(c, "images", tag+":no-such-tag") 234 c.Assert(out, checker.Not(checker.Contains), tag) 235 }