-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjob.go
59 lines (49 loc) · 1.37 KB
/
job.go
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
package main
import (
"encoding/json"
"io"
"log"
"time"
"github.com/rochacon/docker-cron/Godeps/_workspace/src/github.com/fsouza/go-dockerclient"
)
// Job is the definition of a CRON job
type Job struct {
Id string
Interval string
Name string
Container docker.Config
}
// NewJob returns a Job instance parsed from a JSON reader
func NewJob(r io.Reader) (*Job, error) {
j := &Job{}
if err := json.NewDecoder(r).Decode(&j); err != nil {
return j, err
}
return j, nil
}
// Run executes a Job
func (j *Job) Run() {
started := time.Now()
dcli, err := docker.NewClient(DOCKER_HOST)
if err != nil {
log.Printf("[%s] Error connecting to Docker instance: %q\n", j.Id, err)
return
}
c, err := dcli.CreateContainer(docker.CreateContainerOptions{j.Name, &j.Container, nil})
if err != nil {
log.Printf("[%s] Error creating container: %q\n", j.Id, err)
return
}
defer dcli.RemoveContainer(docker.RemoveContainerOptions{ID: c.ID})
log.Printf("[%s] Starting job...\n", j.Id)
if err := dcli.StartContainer(c.ID, &docker.HostConfig{}); err != nil {
log.Printf("[%s] Error starting container: %q\n", j.Id, err)
return
}
status, err := dcli.WaitContainer(c.ID)
if err != nil {
log.Printf("[%s] Error waiting container execution: %q\n", j.Id, err)
return
}
log.Printf("[%s] Job finished with status %d in %s.\n", j.Id, status, time.Since(started))
}