-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrun.go
More file actions
149 lines (128 loc) · 3.55 KB
/
run.go
File metadata and controls
149 lines (128 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package main
import (
"docker-demo/cgroups"
"docker-demo/cgroups/subsystems"
"docker-demo/container"
"docker-demo/util"
"encoding/json"
"fmt"
"math/rand"
"os/exec"
"strconv"
"time"
"os"
"strings"
log "github.com/sirupsen/logrus"
)
func Run(tty bool, comArray []string, res *subsystems.ResourceConfig, volume string, containerName string) {
// 先确保容器名字不为空
if containerName == "" {
containerName = randStringBytes(10)
}
parent, writePipe := container.NewParentProcess(tty, volume, containerName)
if parent == nil {
log.Errorf("New parent process error")
return
}
if err := parent.Start(); err != nil { // 启动容器
log.Error(err)
}
//record container info
var err error
containerName, err = recordContainerInfo(parent.Process.Pid, comArray, containerName)
if err != nil {
log.Errorf("Record container info error %v", err)
return
}
if res != nil {
// use docker-demo as cgroup name
// 设置资源限制
cgroupManager := cgroups.NewCgroupManager("docker-demo1") // 如果名字是docker-demo,会把执行文件删掉
defer cgroupManager.Destroy()
cgroupManager.Set(res)
cgroupManager.Apply(parent.Process.Pid)
}
// 初始化容器
sendInitCommand(comArray, writePipe)
if tty {
parent.Wait()
deleteContainerInfo(containerName)
// 为宿主机重新mount proc
util.MountProc()
// vloume
mntURL := "/root/mnt"
rootURL := "/root"
// ShowMountPoint(rootURL, mntURL)
container.DeleteWorkSpace(rootURL, mntURL, volume)
log.Infof("Run after wait")
}
log.Infof("Run end")
}
func sendInitCommand(comArray []string, writePipe *os.File) {
command := strings.Join(comArray, " ")
log.Infof("command all is %s", command)
writePipe.WriteString(command)
writePipe.Close()
}
func ShowMountPoint(rootURL string, mntURL string) {
cmd := exec.Command("ls", "-al", rootURL)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
log.Errorf("ls err:%v", err)
}
}
func recordContainerInfo(containerPID int, commandArray []string, containerName string) (string, error) {
id := randStringBytes(10)
createTime := time.Now().Format("2006-01-02 15:04:05")
command := strings.Join(commandArray, "")
if containerName == "" {
containerName = id
}
containerInfo := &container.ContainerInfo{
Id: id,
Pid: strconv.Itoa(containerPID),
Command: command,
CreatedTime: createTime,
Status: container.RUNNING,
Name: containerName,
}
jsonBytes, err := json.Marshal(containerInfo)
if err != nil {
log.Errorf("Record container info error %v", err)
return "", err
}
jsonStr := string(jsonBytes)
dirUrl := fmt.Sprintf(container.DefaultInfoLocation, containerName)
if err := os.MkdirAll(dirUrl, 0622); err != nil {
log.Errorf("Mkdir error %s error %v", dirUrl, err)
return "", err
}
fileName := dirUrl + "/" + container.ConfigName
file, err := os.Create(fileName)
defer file.Close()
if err != nil {
log.Errorf("Create file %s error %v", fileName, err)
return "", err
}
if _, err := file.WriteString(jsonStr); err != nil {
log.Errorf("File write string error %v", err)
return "", err
}
return containerName, nil
}
func deleteContainerInfo(containerId string) {
dirURL := fmt.Sprintf(container.DefaultInfoLocation, containerId)
if err := os.RemoveAll(dirURL); err != nil {
log.Errorf("Remove dir %s error %v", dirURL, err)
}
}
func randStringBytes(n int) string {
letterBytes := "1234567890"
rand.Seed(time.Now().UnixNano())
b := make([]byte, n)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
return string(b)
}