Browse code

Expose RootFS in image inspect

Fixes #20451

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>

Tonis Tiigi authored on 2016/03/22 01:56:51
Showing 5 changed files
... ...
@@ -1164,6 +1164,7 @@ func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
1164 1164
 		Os:              img.OS,
1165 1165
 		Size:            size,
1166 1166
 		VirtualSize:     size, // TODO: field unused, deprecate
1167
+		RootFS:          rootFSToAPIType(img.RootFS),
1167 1168
 	}
1168 1169
 
1169 1170
 	imageInspect.GraphDriver.Name = daemon.GraphDriverName()
... ...
@@ -1092,3 +1092,14 @@ func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) {
1092 1092
 func (daemon *Daemon) setDefaultIsolation() error {
1093 1093
 	return nil
1094 1094
 }
1095
+
1096
+func rootFSToAPIType(rootfs *image.RootFS) types.RootFS {
1097
+	var layers []string
1098
+	for _, l := range rootfs.DiffIDs {
1099
+		layers = append(layers, l.String())
1100
+	}
1101
+	return types.RootFS{
1102
+		Type:   rootfs.Type,
1103
+		Layers: layers,
1104
+	}
1105
+}
... ...
@@ -453,3 +453,15 @@ func (daemon *Daemon) setDefaultIsolation() error {
453 453
 	logrus.Infof("Windows default isolation mode: %s", daemon.defaultIsolation)
454 454
 	return nil
455 455
 }
456
+
457
+func rootFSToAPIType(rootfs *image.RootFS) types.RootFS {
458
+	var layers []string
459
+	for _, l := range rootfs.DiffIDs {
460
+		layers = append(layers, l.String())
461
+	}
462
+	return types.RootFS{
463
+		Type:      rootfs.Type,
464
+		Layers:    layers,
465
+		BaseLayer: rootfs.BaseLayer,
466
+	}
467
+}
... ...
@@ -1790,12 +1790,12 @@ Return low-level information on the image `name`
1790 1790
     Content-Type: application/json
1791 1791
 
1792 1792
     {
1793
-       "Id" : "85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c",
1793
+       "Id" : "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c",
1794 1794
        "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a",
1795 1795
        "Comment" : "",
1796 1796
        "Os" : "linux",
1797 1797
        "Architecture" : "amd64",
1798
-       "Parent" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c",
1798
+       "Parent" : "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c",
1799 1799
        "ContainerConfig" : {
1800 1800
           "Tty" : false,
1801 1801
           "Hostname" : "e611e15f9c9d",
... ...
@@ -1876,6 +1876,13 @@ Return low-level information on the image `name`
1876 1876
           "AttachStderr" : false,
1877 1877
           "WorkingDir" : "",
1878 1878
           "User" : ""
1879
+       },
1880
+       "RootFS": {
1881
+           "Type": "layers",
1882
+           "Layers": [
1883
+               "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6",
1884
+               "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
1885
+           ]
1879 1886
        }
1880 1887
     }
1881 1888
 
... ...
@@ -379,3 +379,15 @@ func (s *DockerSuite) TestInspectContainerNetworkCustom(c *check.C) {
379 379
 	out = inspectField(c, "container1", "NetworkSettings.Networks.net1.NetworkID")
380 380
 	c.Assert(strings.TrimSpace(out), checker.Equals, strings.TrimSpace(netOut))
381 381
 }
382
+
383
+func (s *DockerSuite) TestInspectRootFS(c *check.C) {
384
+	testRequires(c, DaemonIsLinux)
385
+	out, _, err := dockerCmdWithError("inspect", "busybox")
386
+	c.Assert(err, check.IsNil)
387
+
388
+	var imageJSON []types.ImageInspect
389
+	err = json.Unmarshal([]byte(out), &imageJSON)
390
+	c.Assert(err, checker.IsNil)
391
+
392
+	c.Assert(len(imageJSON[0].RootFS.Layers), checker.GreaterOrEqualThan, 1)
393
+}