Skip to content

Commit ac9f555

Browse files
committed
Use container metadata as fallback for username
1 parent 9d7595b commit ac9f555

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

internal/pkg/devcontainers/dockerutils.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,12 @@ func ExecInDevContainer(containerID string, workDir string, args []string) error
239239
if err != nil {
240240
return err
241241
}
242+
if userName == "" {
243+
userName, err = getUserNameFromRunningContainer(containerID)
244+
if err != nil {
245+
return err
246+
}
247+
}
242248

243249
statusWriter.Printf("Checking for SSH_AUTH_SOCK")
244250
sshAuthSockValue, err := getSshAuthSockValue(containerID)
@@ -485,3 +491,28 @@ func testContainerPathExists(containerID string, path string) (bool, error) {
485491
response := strings.TrimSpace(string(buf))
486492
return response == "0", nil
487493
}
494+
495+
func getUserNameFromRunningContainer(containerID string) (string, error) {
496+
dockerArgs := []string{"inspect", containerID, "--format", "{{index .Config.Labels \"devcontainer.metadata\" }}"}
497+
dockerCmd := exec.Command("docker", dockerArgs...)
498+
buf, err := dockerCmd.CombinedOutput()
499+
if err != nil {
500+
errMessage := string(buf)
501+
return "", fmt.Errorf("Docker exec error: %s (%s)", err, strings.TrimSpace(errMessage))
502+
}
503+
504+
var metadata []interface{}
505+
err = json.Unmarshal(buf, &metadata)
506+
if err != nil {
507+
return "", nil
508+
}
509+
510+
for _, value := range metadata {
511+
if valueMap, ok := value.(map[string]interface{}); ok {
512+
if userName, ok := valueMap["remoteUser"]; ok {
513+
return userName.(string), nil
514+
}
515+
}
516+
}
517+
return "", nil
518+
}

0 commit comments

Comments
 (0)