github.com/replicatedhq/ship@v0.55.0/pkg/images/progress.go (about) 1 package images 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 8 "github.com/docker/docker/pkg/jsonmessage" 9 "github.com/go-kit/kit/log" 10 "github.com/pkg/errors" 11 ) 12 13 // TODO: This only supports json messages like this one: 14 // {"status":"Waiting","progressDetail":{},"id":"462d60a56b09"} 15 16 type Progress struct { 17 ID string `json:"id"` // this will be layer ID 18 Status string `json:"status"` 19 Image string `json:"image"` 20 ProgressDetail interface{} `json:"progressDetail"` 21 } 22 23 func copyDockerProgress(debug log.Logger, image string, reader io.ReadCloser, ch chan interface{}) error { 24 dec := json.NewDecoder(reader) 25 for { 26 var jm jsonmessage.JSONMessage 27 if err := dec.Decode(&jm); err == io.EOF { 28 return nil 29 } else if err != nil { 30 return errors.Wrap(err, "copy docker progress") 31 } else if jm.Error != nil { 32 return jm.Error 33 } 34 35 debug.Log("event", "docker.JSONMessage.receive", "JSONMessage", fmt.Sprintf("%+v", jm)) 36 37 ch <- Progress{ 38 ID: jm.ID, 39 Status: jm.Status, 40 Image: image, 41 ProgressDetail: jm.Progress, 42 } 43 } 44 }