@@ -18,18 +18,20 @@ package docker
18
18
19
19
import (
20
20
"context"
21
- "encoding/base64"
22
21
"encoding/json"
23
22
"fmt"
24
23
"os"
25
24
"path/filepath"
26
25
26
+ "github.com/distribution/reference"
27
27
"github.com/docker/cli/cli/config"
28
28
"github.com/docker/cli/cli/config/configfile"
29
- "github.com/docker/distribution/reference "
29
+ clitypes "github.com/docker/cli/cli/config/types "
30
30
types "github.com/docker/docker/api/types/registry"
31
31
"github.com/docker/docker/pkg/homedir"
32
32
"github.com/docker/docker/registry"
33
+ "github.com/google/go-containerregistry/pkg/authn"
34
+ "github.com/google/go-containerregistry/pkg/v1/google"
33
35
34
36
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/gcp"
35
37
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/output/log"
@@ -79,14 +81,72 @@ func (h credsHelper) GetAuthConfig(registry string) (types.AuthConfig, error) {
79
81
return types.AuthConfig {}, err
80
82
}
81
83
84
+ return h .loadCredentials (cf , registry )
85
+ }
86
+
87
+ func (h credsHelper ) loadCredentials (cf * configfile.ConfigFile , registry string ) (types.AuthConfig , error ) {
88
+ if helper := cf .CredentialHelpers [registry ]; helper == "gcloud" {
89
+ authCfg , err := h .getGoogleAuthConfig (registry )
90
+ if err == nil {
91
+ return authCfg , nil
92
+ }
93
+ log .Entry (context .TODO ()).Debugf ("error getting google authenticator, falling back to docker auth: %v" , err )
94
+ }
95
+
96
+ var anonymous clitypes.AuthConfig
82
97
auth , err := cf .GetAuthConfig (registry )
83
98
if err != nil {
84
99
return types.AuthConfig {}, err
85
100
}
86
101
102
+ // From go-containerrergistry logic, the ServerAddress is not considered when determining if returned auth is anonymous.
103
+ anonymous .ServerAddress = auth .ServerAddress
104
+ if auth != anonymous {
105
+ return types .AuthConfig (auth ), nil
106
+ }
107
+
108
+ if isGoogleRegistry (registry ) {
109
+ authCfg , err := h .getGoogleAuthConfig (registry )
110
+ if err == nil {
111
+ return authCfg , nil
112
+ }
113
+ }
114
+
87
115
return types .AuthConfig (auth ), nil
88
116
}
89
117
118
+ func (h credsHelper ) getGoogleAuthConfig (registry string ) (types.AuthConfig , error ) {
119
+ auth , err := google .NewEnvAuthenticator ()
120
+ if err != nil {
121
+ return types.AuthConfig {}, err
122
+ }
123
+
124
+ if auth == authn .Anonymous {
125
+ return types.AuthConfig {}, fmt .Errorf ("error getting google authenticator" )
126
+ }
127
+
128
+ cfg , err := auth .Authorization ()
129
+ if err != nil {
130
+ return types.AuthConfig {}, err
131
+ }
132
+
133
+ bCfg , err := cfg .MarshalJSON ()
134
+ if err != nil {
135
+ return types.AuthConfig {}, err
136
+ }
137
+
138
+ var authCfg types.AuthConfig
139
+ err = json .Unmarshal (bCfg , & authCfg )
140
+ if err != nil {
141
+ return types.AuthConfig {}, err
142
+ }
143
+
144
+ // The docker library does the same when we request the credentials
145
+ authCfg .ServerAddress = registry
146
+
147
+ return authCfg , nil
148
+ }
149
+
90
150
// GetAllAuthConfigs retrieves all the auth configs.
91
151
// Because this can take a long time, we make sure it can be interrupted by the user.
92
152
func (h credsHelper ) GetAllAuthConfigs (ctx context.Context ) (map [string ]types.AuthConfig , error ) {
@@ -111,22 +171,31 @@ func (h credsHelper) GetAllAuthConfigs(ctx context.Context) (map[string]types.Au
111
171
}
112
172
113
173
func (h credsHelper ) doGetAllAuthConfigs () (map [string ]types.AuthConfig , error ) {
174
+ credentials := make (map [string ]types.AuthConfig )
114
175
cf , err := loadDockerConfig ()
115
176
if err != nil {
116
177
return nil , err
117
178
}
118
179
119
- credentials , err := cf .GetAllCredentials ()
180
+ defaultCreds , err := cf .GetCredentialsStore ( "" ). GetAll ()
120
181
if err != nil {
121
182
return nil , err
122
183
}
123
184
124
- authConfigs := make (map [string ]types.AuthConfig , len (credentials ))
125
- for k , auth := range credentials {
126
- authConfigs [k ] = types .AuthConfig (auth )
185
+ for registry , cred := range defaultCreds {
186
+ credentials [registry ] = types .AuthConfig (cred )
187
+ }
188
+
189
+ for registry := range cf .CredentialHelpers {
190
+ authCfg , err := h .loadCredentials (cf , registry )
191
+ if err != nil {
192
+ log .Entry (context .TODO ()).Debugf ("failed to get credentials for registry %v: %v" , registry , err )
193
+ continue
194
+ }
195
+ credentials [registry ] = authCfg
127
196
}
128
197
129
- return authConfigs , nil
198
+ return credentials , nil
130
199
}
131
200
132
201
func (l * localDaemon ) encodedRegistryAuth (ctx context.Context , a AuthConfigHelper , image string ) (string , error ) {
@@ -150,12 +219,7 @@ func (l *localDaemon) encodedRegistryAuth(ctx context.Context, a AuthConfigHelpe
150
219
return "" , fmt .Errorf ("getting auth config: %w" , err )
151
220
}
152
221
153
- buf , err := json .Marshal (ac )
154
- if err != nil {
155
- return "" , err
156
- }
157
-
158
- return base64 .URLEncoding .EncodeToString (buf ), nil
222
+ return types .EncodeAuthConfig (ac )
159
223
}
160
224
161
225
func (l * localDaemon ) officialRegistry (ctx context.Context ) string {
0 commit comments