浏览代码

Merge pull request #21370 from tonistiigi/expose-layer-ids

Expose RootFS in image inspect
Tibor Vass 9 年之前
父节点
当前提交
694b32df51

+ 1 - 0
daemon/daemon.go

@@ -1164,6 +1164,7 @@ func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
 		Os:              img.OS,
 		Os:              img.OS,
 		Size:            size,
 		Size:            size,
 		VirtualSize:     size, // TODO: field unused, deprecate
 		VirtualSize:     size, // TODO: field unused, deprecate
+		RootFS:          rootFSToAPIType(img.RootFS),
 	}
 	}
 
 
 	imageInspect.GraphDriver.Name = daemon.GraphDriverName()
 	imageInspect.GraphDriver.Name = daemon.GraphDriverName()

+ 11 - 0
daemon/daemon_unix.go

@@ -1097,3 +1097,14 @@ func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) {
 func (daemon *Daemon) setDefaultIsolation() error {
 func (daemon *Daemon) setDefaultIsolation() error {
 	return nil
 	return nil
 }
 }
+
+func rootFSToAPIType(rootfs *image.RootFS) types.RootFS {
+	var layers []string
+	for _, l := range rootfs.DiffIDs {
+		layers = append(layers, l.String())
+	}
+	return types.RootFS{
+		Type:   rootfs.Type,
+		Layers: layers,
+	}
+}

+ 12 - 0
daemon/daemon_windows.go

@@ -453,3 +453,15 @@ func (daemon *Daemon) setDefaultIsolation() error {
 	logrus.Infof("Windows default isolation mode: %s", daemon.defaultIsolation)
 	logrus.Infof("Windows default isolation mode: %s", daemon.defaultIsolation)
 	return nil
 	return nil
 }
 }
+
+func rootFSToAPIType(rootfs *image.RootFS) types.RootFS {
+	var layers []string
+	for _, l := range rootfs.DiffIDs {
+		layers = append(layers, l.String())
+	}
+	return types.RootFS{
+		Type:      rootfs.Type,
+		Layers:    layers,
+		BaseLayer: rootfs.BaseLayer,
+	}
+}

+ 9 - 2
docs/reference/api/docker_remote_api_v1.23.md

@@ -1790,12 +1790,12 @@ Return low-level information on the image `name`
     Content-Type: application/json
     Content-Type: application/json
 
 
     {
     {
-       "Id" : "85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c",
+       "Id" : "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c",
        "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a",
        "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a",
        "Comment" : "",
        "Comment" : "",
        "Os" : "linux",
        "Os" : "linux",
        "Architecture" : "amd64",
        "Architecture" : "amd64",
-       "Parent" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c",
+       "Parent" : "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c",
        "ContainerConfig" : {
        "ContainerConfig" : {
           "Tty" : false,
           "Tty" : false,
           "Hostname" : "e611e15f9c9d",
           "Hostname" : "e611e15f9c9d",
@@ -1876,6 +1876,13 @@ Return low-level information on the image `name`
           "AttachStderr" : false,
           "AttachStderr" : false,
           "WorkingDir" : "",
           "WorkingDir" : "",
           "User" : ""
           "User" : ""
+       },
+       "RootFS": {
+           "Type": "layers",
+           "Layers": [
+               "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6",
+               "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
+           ]
        }
        }
     }
     }
 
 

+ 12 - 0
integration-cli/docker_cli_inspect_test.go

@@ -379,3 +379,15 @@ func (s *DockerSuite) TestInspectContainerNetworkCustom(c *check.C) {
 	out = inspectField(c, "container1", "NetworkSettings.Networks.net1.NetworkID")
 	out = inspectField(c, "container1", "NetworkSettings.Networks.net1.NetworkID")
 	c.Assert(strings.TrimSpace(out), checker.Equals, strings.TrimSpace(netOut))
 	c.Assert(strings.TrimSpace(out), checker.Equals, strings.TrimSpace(netOut))
 }
 }
+
+func (s *DockerSuite) TestInspectRootFS(c *check.C) {
+	testRequires(c, DaemonIsLinux)
+	out, _, err := dockerCmdWithError("inspect", "busybox")
+	c.Assert(err, check.IsNil)
+
+	var imageJSON []types.ImageInspect
+	err = json.Unmarshal([]byte(out), &imageJSON)
+	c.Assert(err, checker.IsNil)
+
+	c.Assert(len(imageJSON[0].RootFS.Layers), checker.GreaterOrEqualThan, 1)
+}