Skip to content

Commit

Permalink
Merge pull request moby#11464 from ncdc/fix-duplicate-dangling-images
Browse files Browse the repository at this point in the history
Fix duplicate display of dangling images
  • Loading branch information
Jessie Frazelle committed Mar 18, 2015
2 parents 50bf3cb + c680dd9 commit 29f8092
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 16 deletions.
35 changes: 19 additions & 16 deletions api/client/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -1518,29 +1518,32 @@ func (cli *DockerCli) CmdImages(args ...string) error {
outID = common.TruncateID(outID)
}

// Tags referring to this image ID.
for _, repotag := range out.GetList("RepoTags") {
repo, tag := parsers.ParseRepositoryTag(repotag)
repoTags := out.GetList("RepoTags")
repoDigests := out.GetList("RepoDigests")

if !*quiet {
if *showDigests {
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s ago\t%s\n", repo, tag, "<none>", outID, units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), units.HumanSize(float64(out.GetInt64("VirtualSize"))))
} else {
fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\n", repo, tag, outID, units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), units.HumanSize(float64(out.GetInt64("VirtualSize"))))
}
if len(repoTags) == 1 && repoTags[0] == "<none>:<none>" && len(repoDigests) == 1 && repoDigests[0] == "<none>@<none>" {
// dangling image - clear out either repoTags or repoDigsts so we only show it once below
repoDigests = []string{}
}

// combine the tags and digests lists
tagsAndDigests := append(repoTags, repoDigests...)
for _, repoAndRef := range tagsAndDigests {
repo, ref := parsers.ParseRepositoryTag(repoAndRef)
// default tag and digest to none - if there's a value, it'll be set below
tag := "<none>"
digest := "<none>"
if utils.DigestReference(ref) {
digest = ref
} else {
fmt.Fprintln(w, outID)
tag = ref
}
}

// Digests referring to this image ID.
for _, repoDigest := range out.GetList("RepoDigests") {
repo, digest := parsers.ParseRepositoryTag(repoDigest)
if !*quiet {
if *showDigests {
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s ago\t%s\n", repo, "<none>", digest, outID, units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), units.HumanSize(float64(out.GetInt64("VirtualSize"))))
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s ago\t%s\n", repo, tag, digest, outID, units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), units.HumanSize(float64(out.GetInt64("VirtualSize"))))
} else {
fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\n", repo, "<none>", outID, units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), units.HumanSize(float64(out.GetInt64("VirtualSize"))))
fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\n", repo, tag, outID, units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))), units.HumanSize(float64(out.GetInt64("VirtualSize"))))
}
} else {
fmt.Fprintln(w, outID)
Expand Down
43 changes: 43 additions & 0 deletions integration-cli/docker_cli_images_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
"strings"
"testing"
"time"

"github.com/docker/docker/pkg/common"
)

func TestImagesEnsureImageIsListed(t *testing.T) {
Expand Down Expand Up @@ -176,3 +178,44 @@ func TestImagesFilterWhiteSpaceTrimmingAndLowerCasingWorking(t *testing.T) {

logDone("images - white space trimming and lower casing")
}

func TestImagesEnsureDanglingImageOnlyListedOnce(t *testing.T) {
defer deleteAllContainers()

// create container 1
c := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
out, _, err := runCommandWithOutput(c)
if err != nil {
t.Fatalf("error running busybox: %s, %v", out, err)
}
containerId1 := strings.TrimSpace(out)

// tag as foobox
c = exec.Command(dockerBinary, "commit", containerId1, "foobox")
out, _, err = runCommandWithOutput(c)
if err != nil {
t.Fatalf("error tagging foobox: %s", err)
}
imageId := common.TruncateID(strings.TrimSpace(out))
defer deleteImages(imageId)

// overwrite the tag, making the previous image dangling
c = exec.Command(dockerBinary, "tag", "-f", "busybox", "foobox")
out, _, err = runCommandWithOutput(c)
if err != nil {
t.Fatalf("error tagging foobox: %s", err)
}
defer deleteImages("foobox")

c = exec.Command(dockerBinary, "images", "-q", "-f", "dangling=true")
out, _, err = runCommandWithOutput(c)
if err != nil {
t.Fatalf("listing images failed with errors: %s, %v", out, err)
}

if e, a := 1, strings.Count(out, imageId); e != a {
t.Fatalf("expected 1 dangling image, got %d: %s", a, out)
}

logDone("images - dangling image only listed once")
}

0 comments on commit 29f8092

Please sign in to comment.