Skip to content

Commit eb38750

Browse files
committed
Remove the os.user dependency and manually lookup /etc/passwd instead
1 parent 8e6c249 commit eb38750

2 files changed

Lines changed: 23 additions & 5 deletions

File tree

sysinit.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ package docker
33
import (
44
"flag"
55
"fmt"
6+
"github.com/dotcloud/docker/utils"
67
"log"
78
"os"
89
"os/exec"
9-
"os/user"
1010
"strconv"
1111
"strings"
1212
"syscall"
@@ -27,10 +27,7 @@ func changeUser(u string) {
2727
if u == "" {
2828
return
2929
}
30-
userent, err := user.LookupId(u)
31-
if err != nil {
32-
userent, err = user.Lookup(u)
33-
}
30+
userent, err := utils.UserLookup(u)
3431
if err != nil {
3532
log.Fatalf("Unable to find user %v: %v", u, err)
3633
}

utils/utils.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"net/http"
1515
"os"
1616
"os/exec"
17+
"os/user"
1718
"path/filepath"
1819
"runtime"
1920
"strconv"
@@ -700,3 +701,23 @@ func ParseRepositoryTag(repos string) (string, string) {
700701
}
701702
return repos, ""
702703
}
704+
705+
func UserLookup(uid string) (*user.User, error) {
706+
file, err := ioutil.ReadFile("/etc/passwd")
707+
if err != nil {
708+
return nil, err
709+
}
710+
for _, line := range strings.Split(string(file), "\n") {
711+
data := strings.Split(line, ":")
712+
if len(data) > 5 && (data[0] == uid || data[2] == uid) {
713+
return &user.User{
714+
Uid: data[2],
715+
Gid: data[3],
716+
Username: data[0],
717+
Name: data[4],
718+
HomeDir: data[5],
719+
}, nil
720+
}
721+
}
722+
return nil, fmt.Errorf("User not found in /etc/passwd")
723+
}

0 commit comments

Comments
 (0)