Browse Source

Merge pull request #17115 from mountkin/tag-on-build

Proposal: emit a "tag" event when building image with "-t" parameter
Doug Davis 9 years ago
parent
commit
e62fd33d96

+ 0 - 1
api/server/router/local/image.go

@@ -462,7 +462,6 @@ func (s *router) postImagesTag(ctx context.Context, w http.ResponseWriter, r *ht
 	if err := s.daemon.TagImage(repo, tag, name, force); err != nil {
 		return err
 	}
-	s.daemon.EventsService.Log("tag", utils.ImageReference(repo, tag), "")
 	w.WriteHeader(http.StatusCreated)
 	return nil
 }

+ 6 - 1
daemon/daemon.go

@@ -50,6 +50,7 @@ import (
 	"github.com/docker/docker/pkg/truncindex"
 	"github.com/docker/docker/registry"
 	"github.com/docker/docker/runconfig"
+	"github.com/docker/docker/utils"
 	volumedrivers "github.com/docker/docker/volume/drivers"
 	"github.com/docker/docker/volume/local"
 	"github.com/docker/docker/volume/store"
@@ -1026,7 +1027,11 @@ func (daemon *Daemon) Graph() *graph.Graph {
 // imageName. If force is true, an existing tag with the same name may be
 // overwritten.
 func (daemon *Daemon) TagImage(repoName, tag, imageName string, force bool) error {
-	return daemon.repositories.Tag(repoName, tag, imageName, force)
+	if err := daemon.repositories.Tag(repoName, tag, imageName, force); err != nil {
+		return err
+	}
+	daemon.EventsService.Log("tag", utils.ImageReference(repoName, tag), "")
+	return nil
 }
 
 // PullImage initiates a pull operation. image is the repository name to pull, and

+ 35 - 0
integration-cli/docker_cli_build_test.go

@@ -7,6 +7,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"io/ioutil"
+	"net/http"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -6223,3 +6224,37 @@ func (s *DockerSuite) TestBuildNoNamedVolume(c *check.C) {
 	_, err := buildImage("test", dockerFile, false)
 	c.Assert(err, check.NotNil, check.Commentf("image build should have failed"))
 }
+
+func (s *DockerSuite) TestBuildTagEvent(c *check.C) {
+	testRequires(c, DaemonIsLinux)
+	resp, rc, err := sockRequestRaw("GET", `/events?filters={"event":["tag"]}`, nil, "application/json")
+	c.Assert(err, check.IsNil)
+	defer rc.Close()
+	c.Assert(resp.StatusCode, check.Equals, http.StatusOK)
+
+	type event struct {
+		Status string `json:"status"`
+		ID     string `json:"id"`
+	}
+	ch := make(chan event)
+	go func() {
+		ev := event{}
+		if err := json.NewDecoder(rc).Decode(&ev); err == nil {
+			ch <- ev
+		}
+	}()
+
+	dockerFile := `FROM busybox
+	RUN echo events
+	`
+	_, err = buildImage("test", dockerFile, false)
+	c.Assert(err, check.IsNil)
+
+	select {
+	case ev := <-ch:
+		c.Assert(ev.Status, check.Equals, "tag")
+		c.Assert(ev.ID, check.Equals, "test:")
+	case <-time.After(time.Second):
+		c.Fatal("The 'tag' event not heard from the server")
+	}
+}

+ 6 - 4
integration-cli/docker_cli_events_test.go

@@ -414,13 +414,13 @@ func (s *DockerSuite) TestEventsFilterLabels(c *check.C) {
 func (s *DockerSuite) TestEventsFilterImageLabels(c *check.C) {
 	testRequires(c, DaemonIsLinux)
 	since := daemonTime(c).Unix()
-	name := "labelfilterimage"
+	name := "labelfiltertest"
 	label := "io.docker.testing=image"
 
 	// Build a test image.
-	_, err := buildImage(name, `
+	_, err := buildImage(name, fmt.Sprintf(`
 		FROM busybox:latest
-		LABEL io.docker.testing=image`, true)
+		LABEL %s`, label), true)
 	if err != nil {
 		c.Fatalf("Couldn't create image: %q", err)
 	}
@@ -437,7 +437,9 @@ func (s *DockerSuite) TestEventsFilterImageLabels(c *check.C) {
 		"--filter", fmt.Sprintf("label=%s", label))
 
 	events := strings.Split(strings.TrimSpace(out), "\n")
-	c.Assert(len(events), checker.Equals, 2, check.Commentf("Events == %s", events))
+
+	// 2 events from the "docker tag" command, another one is from "docker build"
+	c.Assert(len(events), checker.Equals, 3, check.Commentf("Events == %s", events))
 	for _, e := range events {
 		c.Assert(e, checker.Contains, "labelfiltertest")
 	}