diff --git a/api/types/versions/v1p19/types.go b/api/types/versions/v1p19/types.go index a2d5337116..da31b5ca20 100644 --- a/api/types/versions/v1p19/types.go +++ b/api/types/versions/v1p19/types.go @@ -3,6 +3,7 @@ package v1p19 import ( "github.com/docker/docker/api/types" + "github.com/docker/docker/pkg/nat" "github.com/docker/docker/runconfig" ) @@ -19,6 +20,10 @@ type ContainerJSON struct { type ContainerConfig struct { *runconfig.Config + MacAddress string + NetworkDisabled bool + ExposedPorts map[nat.Port]struct{} + // backward compatibility, they now live in HostConfig VolumeDriver string Memory int64 diff --git a/api/types/versions/v1p20/types.go b/api/types/versions/v1p20/types.go index 6673f76de8..3255204dac 100644 --- a/api/types/versions/v1p20/types.go +++ b/api/types/versions/v1p20/types.go @@ -3,6 +3,7 @@ package v1p20 import ( "github.com/docker/docker/api/types" + "github.com/docker/docker/pkg/nat" "github.com/docker/docker/runconfig" ) @@ -17,6 +18,10 @@ type ContainerJSON struct { type ContainerConfig struct { *runconfig.Config + MacAddress string + NetworkDisabled bool + ExposedPorts map[nat.Port]struct{} + // backward compatibility, they now live in HostConfig VolumeDriver string } diff --git a/daemon/inspect.go b/daemon/inspect.go index ad5463bd64..8bac0408fb 100644 --- a/daemon/inspect.go +++ b/daemon/inspect.go @@ -48,6 +48,9 @@ func (daemon *Daemon) ContainerInspect120(name string) (*v1p20.ContainerJSON, er mountPoints := addMountPoints(container) config := &v1p20.ContainerConfig{ container.Config, + container.Config.MacAddress, + container.Config.NetworkDisabled, + container.Config.ExposedPorts, container.hostConfig.VolumeDriver, } diff --git a/daemon/inspect_unix.go b/daemon/inspect_unix.go index 4e70f5904a..1122259ff9 100644 --- a/daemon/inspect_unix.go +++ b/daemon/inspect_unix.go @@ -41,6 +41,9 @@ func (daemon *Daemon) ContainerInspectPre120(name string) (*v1p19.ContainerJSON, config := &v1p19.ContainerConfig{ container.Config, + container.Config.MacAddress, + container.Config.NetworkDisabled, + container.Config.ExposedPorts, container.hostConfig.VolumeDriver, container.hostConfig.Memory, container.hostConfig.MemorySwap, diff --git a/integration-cli/docker_api_inspect_test.go b/integration-cli/docker_api_inspect_test.go index d6054a9bbf..4654bb8f7e 100644 --- a/integration-cli/docker_api_inspect_test.go +++ b/integration-cli/docker_api_inspect_test.go @@ -31,8 +31,8 @@ func (s *DockerSuite) TestInspectApiContainerResponse(c *check.C) { endpoint := fmt.Sprintf("/v%s/containers/%s/json", cs.version, cleanedContainerID) status, body, err := sockRequest("GET", endpoint, nil) - c.Assert(status, check.Equals, http.StatusOK) c.Assert(err, check.IsNil) + c.Assert(status, check.Equals, http.StatusOK) var inspectJSON map[string]interface{} if err = json.Unmarshal(body, &inspectJSON); err != nil { @@ -61,8 +61,8 @@ func (s *DockerSuite) TestInspectApiContainerVolumeDriverLegacy(c *check.C) { for _, version := range cases { endpoint := fmt.Sprintf("/v%s/containers/%s/json", version, cleanedContainerID) status, body, err := sockRequest("GET", endpoint, nil) - c.Assert(status, check.Equals, http.StatusOK) c.Assert(err, check.IsNil) + c.Assert(status, check.Equals, http.StatusOK) var inspectJSON map[string]interface{} if err = json.Unmarshal(body, &inspectJSON); err != nil { @@ -87,8 +87,8 @@ func (s *DockerSuite) TestInspectApiContainerVolumeDriver(c *check.C) { endpoint := fmt.Sprintf("/v1.21/containers/%s/json", cleanedContainerID) status, body, err := sockRequest("GET", endpoint, nil) - c.Assert(status, check.Equals, http.StatusOK) c.Assert(err, check.IsNil) + c.Assert(status, check.Equals, http.StatusOK) var inspectJSON map[string]interface{} if err = json.Unmarshal(body, &inspectJSON); err != nil { @@ -133,3 +133,34 @@ func (s *DockerSuite) TestInspectApiImageResponse(c *check.C) { c.Assert(stringutils.InSlice(imageJSON.Tags, "busybox:latest"), check.Equals, true) c.Assert(stringutils.InSlice(imageJSON.Tags, "busybox:mytag"), check.Equals, true) } + +// #17131, #17139, #17173 +func (s *DockerSuite) TestInspectApiEmptyFieldsInConfigPre121(c *check.C) { + out, _ := dockerCmd(c, "run", "-d", "busybox", "true") + + cleanedContainerID := strings.TrimSpace(out) + + cases := []string{"1.19", "1.20"} + for _, version := range cases { + endpoint := fmt.Sprintf("/v%s/containers/%s/json", version, cleanedContainerID) + status, body, err := sockRequest("GET", endpoint, nil) + c.Assert(err, check.IsNil) + c.Assert(status, check.Equals, http.StatusOK) + + var inspectJSON map[string]interface{} + if err = json.Unmarshal(body, &inspectJSON); err != nil { + c.Fatalf("unable to unmarshal body for version %s: %v", version, err) + } + + config, ok := inspectJSON["Config"] + if !ok { + c.Fatal("Unable to find 'Config'") + } + cfg := config.(map[string]interface{}) + for _, f := range []string{"MacAddress", "NetworkDisabled", "ExposedPorts"} { + if _, ok := cfg[f]; !ok { + c.Fatalf("Api version %s expected to include %s in 'Config'", version, f) + } + } + } +}