From 8dfa8a7f2f28125206c4c6f3efcf65f88cd3003e Mon Sep 17 00:00:00 2001 From: beena352 Date: Tue, 5 May 2026 14:00:37 -0700 Subject: [PATCH] wslc: add Config (env, cmd, entrypoint, user, workdir) to container inspect output (#40403) --- src/windows/inc/docker_schema.h | 7 ++++- src/windows/inc/wslc_schema.h | 14 +++++++++- src/windows/wslcsession/WSLCContainer.cpp | 6 +++++ test/windows/WSLCTests.cpp | 31 +++++++++++++++++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/windows/inc/docker_schema.h b/src/windows/inc/docker_schema.h index 2b1d418b4..e1c694a70 100644 --- a/src/windows/inc/docker_schema.h +++ b/src/windows/inc/docker_schema.h @@ -260,8 +260,13 @@ struct ContainerInspectState struct ContainerConfig { std::string Image; + std::string User; + std::string WorkingDir; + std::optional> Env; + std::optional> Cmd; + std::optional> Entrypoint; - NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(ContainerConfig, Image); + NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(ContainerConfig, Image, User, WorkingDir, Env, Cmd, Entrypoint); }; struct InspectMount diff --git a/src/windows/inc/wslc_schema.h b/src/windows/inc/wslc_schema.h index f703d857c..ce90911cd 100644 --- a/src/windows/inc/wslc_schema.h +++ b/src/windows/inc/wslc_schema.h @@ -56,6 +56,17 @@ struct InspectHostConfig NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(InspectHostConfig, NetworkMode); }; +struct InspectContainerConfig +{ + std::optional> Env; + std::optional> Cmd; + std::optional> Entrypoint; + std::string User; + std::string WorkingDir; + + NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(InspectContainerConfig, Env, Cmd, Entrypoint, User, WorkingDir); +}; + struct InspectContainer { std::string Id; @@ -64,11 +75,12 @@ struct InspectContainer std::string Image; InspectState State; InspectHostConfig HostConfig; + InspectContainerConfig Config; std::map> Ports; std::vector Mounts; std::map Labels; - NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(InspectContainer, Id, Name, Created, Image, State, HostConfig, Ports, Mounts, Labels); + NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(InspectContainer, Id, Name, Created, Image, State, HostConfig, Config, Ports, Mounts, Labels); }; struct ImageConfig diff --git a/src/windows/wslcsession/WSLCContainer.cpp b/src/windows/wslcsession/WSLCContainer.cpp index b4cbb98cc..ff703e8b8 100644 --- a/src/windows/wslcsession/WSLCContainer.cpp +++ b/src/windows/wslcsession/WSLCContainer.cpp @@ -1139,6 +1139,12 @@ WslcInspectContainer WSLCContainerImpl::BuildInspectContainer(const DockerInspec wslcInspect.HostConfig.NetworkMode = dockerInspect.HostConfig.NetworkMode; + wslcInspect.Config.Env = dockerInspect.Config.Env; + wslcInspect.Config.Cmd = dockerInspect.Config.Cmd; + wslcInspect.Config.Entrypoint = dockerInspect.Config.Entrypoint; + wslcInspect.Config.User = dockerInspect.Config.User; + wslcInspect.Config.WorkingDir = dockerInspect.Config.WorkingDir; + // Map WSLC port mappings (Windows host ports only). HostIp is not set here and will use // the default value ("127.0.0.1") defined in the InspectPortBinding schema. for (const auto& e : m_mappedPorts) diff --git a/test/windows/WSLCTests.cpp b/test/windows/WSLCTests.cpp index d1d613821..c8a57b039 100644 --- a/test/windows/WSLCTests.cpp +++ b/test/windows/WSLCTests.cpp @@ -5766,6 +5766,37 @@ class WSLCTests VERIFY_SUCCEEDED(container.Get().Delete(WSLCDeleteFlagsNone)); } + + // Test that Config fields are populated in inspect output. + { + const std::string envVar = "WSLC_TEST_VAR=hello"; + const std::string workDir = "/tmp"; + + WSLCContainerLauncher launcher("debian:latest", "test-container-inspect-config", {"99999"}, {envVar}); + launcher.SetEntrypoint({"sleep"}); + launcher.SetWorkingDirectory(std::string{workDir}); + launcher.SetUser("nobody"); + + auto container = launcher.Launch(*m_defaultSession); + auto details = container.Inspect(); + + const auto& config = details.Config; + + VERIFY_IS_TRUE(config.Env.has_value()); + VERIFY_IS_TRUE(std::ranges::find(*config.Env, envVar) != config.Env->end()); + + VERIFY_ARE_EQUAL(config.WorkingDir, workDir); + + VERIFY_IS_TRUE(config.Cmd.has_value()); + VERIFY_ARE_EQUAL(1u, config.Cmd->size()); + VERIFY_ARE_EQUAL(config.Cmd->at(0), std::string{"99999"}); + + VERIFY_IS_TRUE(config.Entrypoint.has_value()); + VERIFY_ARE_EQUAL(1u, config.Entrypoint->size()); + VERIFY_ARE_EQUAL(config.Entrypoint->at(0), std::string{"sleep"}); + + VERIFY_ARE_EQUAL(config.User, std::string{"nobody"}); + } } WSLC_TEST_METHOD(Exec)