Fixes #20451
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
| ... | ... |
@@ -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 |
+} |