@@ -12,11 +12,9 @@ import (
12
12
"os"
13
13
"os/exec"
14
14
"path/filepath"
15
- "regexp"
16
15
"strings"
17
16
"syscall"
18
17
19
- "github.com/docker/docker/api/types"
20
18
"github.com/docker/docker/api/types/container"
21
19
img "github.com/docker/docker/api/types/image"
22
20
"github.com/docker/docker/client"
@@ -41,74 +39,6 @@ func ValidDockerVersion() (bool, error) {
41
39
return false , nil
42
40
}
43
41
44
- func getImagePullResponse (image string , response []Event ) (string , error ) {
45
- var imageDigest string
46
- for _ , event := range response {
47
- if event .Error != "" {
48
- err := fmt .Errorf ("Error pulling image %s: %s" , image , event .Error )
49
- return "" , err
50
- }
51
- digestPattern := regexp .MustCompile ("^Digest: (sha256:[a-z|0-9]{64})$" )
52
- digestMatch := digestPattern .FindStringSubmatch (event .Status )
53
- if len (digestMatch ) != 0 {
54
- imageDigest = digestMatch [1 ]
55
- return imageDigest , nil
56
- }
57
- }
58
- err := fmt .Errorf ("Could not pull image %s" , image )
59
- return "" , err
60
- }
61
-
62
- func processImagePullEvents (image string , events []Event ) (string , string , error ) {
63
- imageDigest , err := getImagePullResponse (image , events )
64
- if err != nil {
65
- return "" , "" , err
66
- }
67
-
68
- URLPattern := regexp .MustCompile ("^.+/(.+(:.+){0,1})$" )
69
- URLMatch := URLPattern .FindStringSubmatch (image )
70
- imageName := strings .Replace (URLMatch [1 ], ":" , "" , - 1 )
71
- imageURL := strings .TrimSuffix (image , URLMatch [2 ])
72
- imageID := imageURL + "@" + imageDigest
73
-
74
- return imageID , imageName , nil
75
- }
76
-
77
- type Event struct {
78
- Status string `json:"status"`
79
- Error string `json:"error"`
80
- Progress string `json:"progress"`
81
- ProgressDetail struct {
82
- Current int `json:"current"`
83
- Total int `json:"total"`
84
- } `json:"progressDetail"`
85
- }
86
-
87
- func pullImageFromRepo (image string ) (string , string , error ) {
88
- glog .Info ("Pulling image" )
89
- cli , err := client .NewEnvClient ()
90
- response , err := cli .ImagePull (context .Background (), image , types.ImagePullOptions {})
91
- if err != nil {
92
- return "" , "" , err
93
- }
94
- defer response .Close ()
95
-
96
- d := json .NewDecoder (response )
97
-
98
- var events []Event
99
- for {
100
- var event Event
101
- if err := d .Decode (& event ); err != nil {
102
- if err == io .EOF {
103
- break
104
- }
105
- return "" , "" , err
106
- }
107
- events = append (events , event )
108
- }
109
- return processImagePullEvents (image , events )
110
- }
111
-
112
42
type HistDiff struct {
113
43
Adds []string
114
44
Dels []string
@@ -169,42 +99,29 @@ func processHistOutput(response bytes.Buffer) ([]img.HistoryResponseItem, error)
169
99
return history , nil
170
100
}
171
101
172
- func processPullCmdOutput (image string , response bytes.Buffer ) (string , string , error ) {
173
- respReader := bytes .NewReader (response .Bytes ())
174
- reader := bufio .NewReader (respReader )
102
+ func imageToTar (image , dest string ) (string , error ) {
103
+ cli , err := client .NewEnvClient ()
104
+ if err != nil {
105
+ return "" , err
106
+ }
175
107
176
- var events []Event
177
- for {
178
- var event Event
179
- text , _ , err := reader .ReadLine ()
180
- if err != nil {
181
- if err == io .EOF {
182
- break
183
- }
184
- return "" , "" , err
185
- }
186
- event .Status = string (text )
187
- events = append (events , event )
108
+ imageTarPath , err := saveImageToTar (cli , image , dest )
109
+ if err != nil {
110
+ return "" , err
188
111
}
189
- return processImagePullEvents ( image , events )
112
+ return imageTarPath , nil
190
113
}
191
114
192
- func pullImageCmd (image string ) (string , string , error ) {
193
- glog .Info ("Pulling image" )
194
- pullArgs := []string {"pull" , image }
195
- dockerPullCmd := exec .Command ("docker" , pullArgs ... )
196
- var response bytes.Buffer
197
- dockerPullCmd .Stdout = & response
198
- if err := dockerPullCmd .Run (); err != nil {
199
- if exiterr , ok := err .(* exec.ExitError ); ok {
200
- if status , ok := exiterr .Sys ().(syscall.WaitStatus ); ok {
201
- glog .Error ("Docker Pull Command Exit Status: " , status .ExitStatus ())
202
- }
203
- } else {
204
- return "" , "" , err
205
- }
115
+ // ImageToTar writes an image to a .tar file
116
+ func saveImageToTar (cli client.APIClient , image , tarName string ) (string , error ) {
117
+ glog .Info ("Saving image" )
118
+ imgBytes , err := cli .ImageSave (context .Background (), []string {image })
119
+ if err != nil {
120
+ return "" , err
206
121
}
207
- return processPullCmdOutput (image , response )
122
+ defer imgBytes .Close ()
123
+ newpath := tarName + ".tar"
124
+ return newpath , copyToFile (newpath , imgBytes )
208
125
}
209
126
210
127
func imageToTarCmd (imageID , imageName string ) (string , error ) {
0 commit comments