@@ -7,9 +7,10 @@ import (
7
7
"io"
8
8
"strings"
9
9
10
+ "github.com/buildpacks/imgutil/remote"
11
+
10
12
"github.com/buildpacks/imgutil"
11
13
"github.com/buildpacks/imgutil/local"
12
- "github.com/buildpacks/imgutil/remote"
13
14
"github.com/buildpacks/lifecycle/auth"
14
15
"github.com/docker/docker/api/types"
15
16
"github.com/docker/docker/client"
@@ -38,50 +39,53 @@ func NewFetcher(logger logging.Logger, docker client.CommonAPIClient) *Fetcher {
38
39
var ErrNotFound = errors .New ("not found" )
39
40
40
41
func (f * Fetcher ) Fetch (ctx context.Context , name string , daemon bool , pullPolicy config.PullPolicy ) (imgutil.Image , error ) {
41
- if daemon {
42
- if pullPolicy == config .PullNever {
43
- return f .fetchDaemonImage (name )
44
- } else if pullPolicy == config .PullIfNotPresent {
45
- img , err := f .fetchDaemonImage (name )
46
- if err == nil || ! errors .Is (err , ErrNotFound ) {
47
- return img , err
48
- }
42
+ if ! daemon {
43
+ return f .fetchRemoteImage (name )
44
+ }
45
+
46
+ switch pullPolicy {
47
+ case config .PullNever :
48
+ img , err := f .fetchDaemonImage (name )
49
+ return img , err
50
+ case config .PullIfNotPresent :
51
+ img , err := f .fetchDaemonImage (name )
52
+ if err == nil || ! errors .Is (err , ErrNotFound ) {
53
+ return img , err
49
54
}
50
55
}
51
56
52
- image , err := remote .NewImage (name , authn .DefaultKeychain , remote .FromBaseImage (name ))
53
- if err != nil {
57
+ f .logger .Debugf ("Pulling image %s" , style .Symbol (name ))
58
+ err := f .pullImage (ctx , name )
59
+ if err != nil && ! errors .Is (err , ErrNotFound ) {
54
60
return nil , err
55
61
}
56
62
57
- remoteFound := image .Found ()
63
+ return f .fetchDaemonImage (name )
64
+ }
58
65
59
- if daemon {
60
- if remoteFound {
61
- f .logger .Debugf ("Pulling image %s" , style .Symbol (name ))
62
- if err := f .pullImage (ctx , name ); err != nil {
63
- return nil , err
64
- }
65
- }
66
- return f .fetchDaemonImage (name )
66
+ func (f * Fetcher ) fetchDaemonImage (name string ) (imgutil.Image , error ) {
67
+ image , err := local .NewImage (name , f .docker , local .FromBaseImage (name ))
68
+ if err != nil {
69
+ return nil , err
67
70
}
68
71
69
- if ! remoteFound {
70
- return nil , errors .Wrapf (ErrNotFound , "image %s does not exist in registry " , style .Symbol (name ))
72
+ if ! image . Found () {
73
+ return nil , errors .Wrapf (ErrNotFound , "image %s does not exist on the daemon " , style .Symbol (name ))
71
74
}
72
75
73
76
return image , nil
74
77
}
75
78
76
- func (f * Fetcher ) fetchDaemonImage (name string ) (imgutil.Image , error ) {
77
- image , err := local .NewImage (name , f . docker , local .FromBaseImage (name ))
79
+ func (f * Fetcher ) fetchRemoteImage (name string ) (imgutil.Image , error ) {
80
+ image , err := remote .NewImage (name , authn . DefaultKeychain , remote .FromBaseImage (name ))
78
81
if err != nil {
79
82
return nil , err
80
83
}
81
84
82
85
if ! image .Found () {
83
- return nil , errors .Wrapf (ErrNotFound , "image %s does not exist on the daemon " , style .Symbol (name ))
86
+ return nil , errors .Wrapf (ErrNotFound , "image %s does not exist in registry " , style .Symbol (name ))
84
87
}
88
+
85
89
return image , nil
86
90
}
87
91
@@ -90,10 +94,13 @@ func (f *Fetcher) pullImage(ctx context.Context, imageID string) error {
90
94
if err != nil {
91
95
return err
92
96
}
93
- rc , err := f .docker .ImagePull (ctx , imageID , types.ImagePullOptions {
94
- RegistryAuth : regAuth ,
95
- })
97
+
98
+ rc , err := f .docker .ImagePull (ctx , imageID , types.ImagePullOptions {RegistryAuth : regAuth })
96
99
if err != nil {
100
+ if client .IsErrNotFound (err ) {
101
+ return errors .Wrapf (ErrNotFound , "image %s does not exist on the daemon" , style .Symbol (imageID ))
102
+ }
103
+
97
104
return err
98
105
}
99
106
0 commit comments