@@ -2,26 +2,37 @@ package core
2
2
3
3
import (
4
4
"fmt"
5
+ "strings"
5
6
"time"
6
7
7
8
"github.com/fsouza/go-dockerclient"
8
9
"github.com/gobs/args"
9
10
)
10
11
12
+ var dockercfg * docker.AuthConfigurations
13
+
14
+ func init () {
15
+ dockercfg , _ = docker .NewAuthConfigurationsFromDockerCfg ()
16
+ }
17
+
11
18
type RunJob struct {
12
19
BareJob
13
20
Client * docker.Client `json:"-"`
21
+ User string `default:"root"`
22
+ TTY bool `default:"false"`
23
+ Delete bool `default:"true"`
14
24
Image string
15
- User string `default:"root"`
16
- TTY bool `default:"false"`
17
- Delete bool `default:"true"`
18
25
}
19
26
20
27
func NewRunJob (c * docker.Client ) * RunJob {
21
28
return & RunJob {Client : c }
22
29
}
23
30
24
31
func (j * RunJob ) Run (ctx * Context ) error {
32
+ if err := j .pullImage (); err != nil {
33
+ return err
34
+ }
35
+
25
36
container , err := j .buildContainer ()
26
37
if err != nil {
27
38
return err
@@ -38,6 +49,15 @@ func (j *RunJob) Run(ctx *Context) error {
38
49
return j .deleteContainer (container .ID )
39
50
}
40
51
52
+ func (j * RunJob ) pullImage () error {
53
+ o , a := buildPullOptions (j .Image )
54
+ if err := j .Client .PullImage (o , a ); err != nil {
55
+ return fmt .Errorf ("error pulling image %q: %s" , j .Image , err )
56
+ }
57
+
58
+ return nil
59
+ }
60
+
41
61
func (j * RunJob ) buildContainer () (* docker.Container , error ) {
42
62
c , err := j .Client .CreateContainer (docker.CreateContainerOptions {
43
63
Config : & docker.Config {
@@ -108,3 +128,35 @@ func (j *RunJob) deleteContainer(containerID string) error {
108
128
ID : containerID ,
109
129
})
110
130
}
131
+
132
+ func buildPullOptions (image string ) (docker.PullImageOptions , docker.AuthConfiguration ) {
133
+ tag := "latest"
134
+ registry := ""
135
+
136
+ parts := strings .Split (image , ":" )
137
+ if len (parts ) == 2 {
138
+ tag = parts [1 ]
139
+ }
140
+
141
+ name := parts [0 ]
142
+ parts = strings .Split (name , "/" )
143
+ if len (parts ) > 2 {
144
+ registry = parts [0 ]
145
+ }
146
+
147
+ return docker.PullImageOptions {
148
+ Repository : name ,
149
+ Registry : registry ,
150
+ Tag : tag ,
151
+ }, buildAuthConfiguration (registry )
152
+ }
153
+
154
+ func buildAuthConfiguration (registry string ) docker.AuthConfiguration {
155
+ var auth docker.AuthConfiguration
156
+ if dockercfg == nil {
157
+ return auth
158
+ }
159
+
160
+ auth , _ = dockercfg .Configs [registry ]
161
+ return auth
162
+ }
0 commit comments