Skip to content

Commit eb72b8a

Browse files
authored
Merge pull request #1145 from aemengo/fix-unable-to-pull-insecure-registry
Delegate checking of remote image existence to the daemon Signed-off-by: David Freilich <[email protected]>
2 parents 216a4d1 + 43cc52b commit eb72b8a

File tree

1 file changed

+35
-28
lines changed

1 file changed

+35
-28
lines changed

internal/image/fetcher.go

+35-28
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import (
77
"io"
88
"strings"
99

10+
"github.com/buildpacks/imgutil/remote"
11+
1012
"github.com/buildpacks/imgutil"
1113
"github.com/buildpacks/imgutil/local"
12-
"github.com/buildpacks/imgutil/remote"
1314
"github.com/buildpacks/lifecycle/auth"
1415
"github.com/docker/docker/api/types"
1516
"github.com/docker/docker/client"
@@ -38,50 +39,53 @@ func NewFetcher(logger logging.Logger, docker client.CommonAPIClient) *Fetcher {
3839
var ErrNotFound = errors.New("not found")
3940

4041
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
4954
}
5055
}
5156

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) {
5460
return nil, err
5561
}
5662

57-
remoteFound := image.Found()
63+
return f.fetchDaemonImage(name)
64+
}
5865

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
6770
}
6871

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))
7174
}
7275

7376
return image, nil
7477
}
7578

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))
7881
if err != nil {
7982
return nil, err
8083
}
8184

8285
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))
8487
}
88+
8589
return image, nil
8690
}
8791

@@ -90,10 +94,13 @@ func (f *Fetcher) pullImage(ctx context.Context, imageID string) error {
9094
if err != nil {
9195
return err
9296
}
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})
9699
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+
97104
return err
98105
}
99106

0 commit comments

Comments
 (0)