| ... | ... |
@@ -3,10 +3,10 @@ package docker |
| 3 | 3 |
import ( |
| 4 | 4 |
"flag" |
| 5 | 5 |
"fmt" |
| 6 |
+ "github.com/dotcloud/docker/utils" |
|
| 6 | 7 |
"log" |
| 7 | 8 |
"os" |
| 8 | 9 |
"os/exec" |
| 9 |
- "os/user" |
|
| 10 | 10 |
"strconv" |
| 11 | 11 |
"strings" |
| 12 | 12 |
"syscall" |
| ... | ... |
@@ -27,10 +27,7 @@ func changeUser(u string) {
|
| 27 | 27 |
if u == "" {
|
| 28 | 28 |
return |
| 29 | 29 |
} |
| 30 |
- userent, err := user.LookupId(u) |
|
| 31 |
- if err != nil {
|
|
| 32 |
- userent, err = user.Lookup(u) |
|
| 33 |
- } |
|
| 30 |
+ userent, err := utils.UserLookup(u) |
|
| 34 | 31 |
if err != nil {
|
| 35 | 32 |
log.Fatalf("Unable to find user %v: %v", u, err)
|
| 36 | 33 |
} |
| ... | ... |
@@ -14,6 +14,7 @@ import ( |
| 14 | 14 |
"net/http" |
| 15 | 15 |
"os" |
| 16 | 16 |
"os/exec" |
| 17 |
+ "os/user" |
|
| 17 | 18 |
"path/filepath" |
| 18 | 19 |
"runtime" |
| 19 | 20 |
"strconv" |
| ... | ... |
@@ -700,3 +701,23 @@ func ParseRepositoryTag(repos string) (string, string) {
|
| 700 | 700 |
} |
| 701 | 701 |
return repos, "" |
| 702 | 702 |
} |
| 703 |
+ |
|
| 704 |
+func UserLookup(uid string) (*user.User, error) {
|
|
| 705 |
+ file, err := ioutil.ReadFile("/etc/passwd")
|
|
| 706 |
+ if err != nil {
|
|
| 707 |
+ return nil, err |
|
| 708 |
+ } |
|
| 709 |
+ for _, line := range strings.Split(string(file), "\n") {
|
|
| 710 |
+ data := strings.Split(line, ":") |
|
| 711 |
+ if len(data) > 5 && (data[0] == uid || data[2] == uid) {
|
|
| 712 |
+ return &user.User{
|
|
| 713 |
+ Uid: data[2], |
|
| 714 |
+ Gid: data[3], |
|
| 715 |
+ Username: data[0], |
|
| 716 |
+ Name: data[4], |
|
| 717 |
+ HomeDir: data[5], |
|
| 718 |
+ }, nil |
|
| 719 |
+ } |
|
| 720 |
+ } |
|
| 721 |
+ return nil, fmt.Errorf("User not found in /etc/passwd")
|
|
| 722 |
+} |