diff --git a/app/gitspace/orchestrator/container/devcontainer_container_utils.go b/app/gitspace/orchestrator/container/devcontainer_container_utils.go index 814a4ccb7..371d0c17a 100644 --- a/app/gitspace/orchestrator/container/devcontainer_container_utils.go +++ b/app/gitspace/orchestrator/container/devcontainer_container_utils.go @@ -309,21 +309,25 @@ func GetContainerInfo( return inspectResp.ID, usedPorts, remoteUser, nil } -func ExtractMetadataFromImage( +func ExtractMetadataAndUserFromImage( ctx context.Context, imageName string, dockerClient *client.Client, -) (map[string]any, error) { +) (map[string]any, string, error) { imageInspect, _, err := dockerClient.ImageInspectWithRaw(ctx, imageName) if err != nil { - return nil, fmt.Errorf("error while inspecting image: %w", err) + return nil, "", fmt.Errorf("error while inspecting image: %w", err) + } + imageUser := imageInspect.Config.User + if imageUser == "" { + imageUser = "root" } metadataMap := map[string]any{} if metadata, ok := imageInspect.Config.Labels["devcontainer.metadata"]; ok { dst := []map[string]any{} unmarshalErr := json.Unmarshal([]byte(metadata), &dst) if unmarshalErr != nil { - return nil, fmt.Errorf("error while unmarshalling metadata: %w", err) + return nil, imageUser, fmt.Errorf("error while unmarshalling metadata: %w", err) } for _, values := range dst { for k, v := range values { @@ -331,7 +335,7 @@ func ExtractMetadataFromImage( } } } - return metadataMap, nil + return metadataMap, imageUser, nil } func PullImage( diff --git a/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go b/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go index 393afd5d2..1764a33fa 100644 --- a/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go +++ b/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go @@ -396,7 +396,7 @@ func (e *EmbeddedDockerOrchestrator) runGitspaceSetupSteps( return err } - metadataFromImage, err := ExtractMetadataFromImage(ctx, imageName, dockerClient) + metadataFromImage, imageUser, err := ExtractMetadataAndUserFromImage(ctx, imageName, dockerClient) if err != nil { return err } @@ -419,7 +419,7 @@ func (e *EmbeddedDockerOrchestrator) runGitspaceSetupSteps( gitspaceLogger.Info(fmt.Sprintf("Setting Environment : %v", environment)) } - containerUser := GetContainerUser(runArgsMap, devcontainerConfig, metadataFromImage) + containerUser := GetContainerUser(runArgsMap, devcontainerConfig, metadataFromImage, imageUser) remoteUser := GetRemoteUser(devcontainerConfig, metadataFromImage, containerUser) homeDir := GetUserHomeDir(remoteUser) diff --git a/app/gitspace/orchestrator/container/util.go b/app/gitspace/orchestrator/container/util.go index b0ba67466..8c783a1ba 100644 --- a/app/gitspace/orchestrator/container/util.go +++ b/app/gitspace/orchestrator/container/util.go @@ -51,6 +51,7 @@ func GetContainerUser( runArgsMap map[types.RunArg]*types.RunArgValue, devcontainerConfig types.DevcontainerConfig, metadataFromImage map[string]any, + imageUser string, ) string { if containerUser := getUser(runArgsMap); containerUser != "" { return containerUser @@ -61,7 +62,7 @@ func GetContainerUser( if containerUser, ok := metadataFromImage["containerUser"].(string); ok { return containerUser } - return "" + return imageUser } func ExtractRemoteUserFromLabels(inspectResp types2.ContainerJSON) string {