@@ -27,6 +27,7 @@ import (
27
27
"strings"
28
28
"time"
29
29
30
+ "github.com/cheggaaa/pb/v3"
30
31
"github.com/docker/docker/client"
31
32
"github.com/google/go-containerregistry/pkg/authn"
32
33
"github.com/google/go-containerregistry/pkg/name"
@@ -86,6 +87,7 @@ func DigestByGoLib(imgName string) string {
86
87
// ExistsImageInDaemon if img exist in local docker daemon
87
88
func ExistsImageInDaemon (img string ) bool {
88
89
// Check if image exists locally
90
+ klog .Infof ("Checking for %s in local docker daemon" , img )
89
91
cmd := exec .Command ("docker" , "images" , "--format" , "{{.Repository}}:{{.Tag}}@{{.Digest}}" )
90
92
if output , err := cmd .Output (); err == nil {
91
93
if strings .Contains (string (output ), img ) {
@@ -137,6 +139,9 @@ func Tag(img string) string {
137
139
138
140
// WriteImageToDaemon write img to the local docker daemon
139
141
func WriteImageToDaemon (img string ) error {
142
+ // buffered channel
143
+ c := make (chan v1.Update , 200 )
144
+
140
145
klog .Infof ("Writing %s to local daemon" , img )
141
146
ref , err := name .ParseReference (img )
142
147
if err != nil {
@@ -156,12 +161,38 @@ func WriteImageToDaemon(img string) error {
156
161
return errors .Wrap (err , "getting remote image" )
157
162
}
158
163
klog .V (3 ).Infof ("Writing image %v" , ref )
159
- _ , err = daemon .Write (ref , i )
160
- if err != nil {
161
- return errors .Wrap (err , "writing daemon image" )
164
+ errchan := make (chan error )
165
+ p := pb .Full .Start64 (0 )
166
+ fn := strings .Split (ref .Name (), "@" )[0 ]
167
+ // abbreviate filename for progress
168
+ maxwidth := 30 - len ("..." )
169
+ if len (fn ) > maxwidth {
170
+ fn = fn [0 :maxwidth ] + "..."
162
171
}
172
+ p .Set ("prefix" , " > " + fn + ": " )
173
+ p .Set (pb .Bytes , true )
163
174
164
- return nil
175
+ // Just a hair less than 80 (standard terminal width) for aesthetics & pasting into docs
176
+ p .SetWidth (79 )
177
+
178
+ go func () {
179
+ _ , err = daemon .Write (ref , i , tarball .WithProgress (c ))
180
+ errchan <- err
181
+ }()
182
+ var update v1.Update
183
+ for {
184
+ select {
185
+ case update = <- c :
186
+ p .SetCurrent (update .Complete )
187
+ p .SetTotal (update .Total )
188
+ case err = <- errchan :
189
+ p .Finish ()
190
+ if err != nil {
191
+ return errors .Wrap (err , "writing daemon image" )
192
+ }
193
+ return nil
194
+ }
195
+ }
165
196
}
166
197
167
198
func retrieveImage (ref name.Reference ) (v1.Image , error ) {
0 commit comments