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  }