From 14dc4a7158a141b5c13aa63231e467f0c3235850 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Mon, 21 Mar 2016 09:56:51 -0700 Subject: [PATCH] Expose RootFS in image inspect Fixes #20451 Signed-off-by: Tonis Tiigi --- daemon/daemon.go | 1 + daemon/daemon_unix.go | 11 +++++++++++ daemon/daemon_windows.go | 12 ++++++++++++ docs/reference/api/docker_remote_api_v1.23.md | 11 +++++++++-- integration-cli/docker_cli_inspect_test.go | 12 ++++++++++++ 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/daemon/daemon.go b/daemon/daemon.go index b9b18d770e..10d9bb70ea 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -1164,6 +1164,7 @@ func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) { Os: img.OS, Size: size, VirtualSize: size, // TODO: field unused, deprecate + RootFS: rootFSToAPIType(img.RootFS), } imageInspect.GraphDriver.Name = daemon.GraphDriverName() diff --git a/daemon/daemon_unix.go b/daemon/daemon_unix.go index e9b78ac76d..df17aae452 100644 --- a/daemon/daemon_unix.go +++ b/daemon/daemon_unix.go @@ -1092,3 +1092,14 @@ func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) { func (daemon *Daemon) setDefaultIsolation() error { 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, + } +} diff --git a/daemon/daemon_windows.go b/daemon/daemon_windows.go index 8f5f9120b3..2d07011ad4 100644 --- a/daemon/daemon_windows.go +++ b/daemon/daemon_windows.go @@ -453,3 +453,15 @@ func (daemon *Daemon) setDefaultIsolation() error { logrus.Infof("Windows default isolation mode: %s", daemon.defaultIsolation) 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, + } +} diff --git a/docs/reference/api/docker_remote_api_v1.23.md b/docs/reference/api/docker_remote_api_v1.23.md index 0f455deee0..2d799bd340 100644 --- a/docs/reference/api/docker_remote_api_v1.23.md +++ b/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 { - "Id" : "85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c", + "Id" : "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c", "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a", "Comment" : "", "Os" : "linux", "Architecture" : "amd64", - "Parent" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", + "Parent" : "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", "ContainerConfig" : { "Tty" : false, "Hostname" : "e611e15f9c9d", @@ -1876,6 +1876,13 @@ Return low-level information on the image `name` "AttachStderr" : false, "WorkingDir" : "", "User" : "" + }, + "RootFS": { + "Type": "layers", + "Layers": [ + "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6", + "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" + ] } } diff --git a/integration-cli/docker_cli_inspect_test.go b/integration-cli/docker_cli_inspect_test.go index e365350c47..29614537d6 100644 --- a/integration-cli/docker_cli_inspect_test.go +++ b/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") 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) +}