@@ -4,12 +4,22 @@ import (
44 "context"
55 "errors"
66 "fmt"
7+ "io"
78 "os"
89
10+ "github.com/awslabs/amazon-ecr-credential-helper/ecr-login"
11+ "github.com/chrismellard/docker-credential-acr-env/pkg/credhelper"
912 "github.com/google/go-containerregistry/pkg/authn"
10- "github.com/google/go-containerregistry/pkg/authn/k8schain"
1113 kubernetesauth "github.com/google/go-containerregistry/pkg/authn/kubernetes"
14+ "github.com/google/go-containerregistry/pkg/v1/google"
1215 "gopkg.in/square/go-jose.v2/jwt"
16+ "k8s.io/client-go/kubernetes"
17+ "k8s.io/client-go/rest"
18+ )
19+
20+ var (
21+ amazonKeychain authn.Keychain = authn .NewKeychainFromHelper (ecr .NewECRHelper (ecr .WithLogger (io .Discard )))
22+ azureKeychain authn.Keychain = authn .NewKeychainFromHelper (credhelper .NewACRCredentialsHelper ())
1323)
1424
1525const tokenFileLocation = "/var/run/secrets/kubernetes.io/serviceaccount/token"
@@ -34,8 +44,6 @@ type ref struct {
3444}
3545
3646func getKeychain (ctx context.Context ) (authn.Keychain , error ) {
37- var keychain authn.Keychain
38-
3947 tokenBytes , err := os .ReadFile (tokenFileLocation )
4048 if err != nil {
4149 if errors .Is (err , os .ErrNotExist ) {
@@ -51,16 +59,30 @@ func getKeychain(ctx context.Context) (authn.Keychain, error) {
5159 if err != nil {
5260 return nil , err
5361 }
54-
55- keychain , err = k8schain .NewInCluster (ctx , kubernetesauth.Options {
62+ clusterConfig , err := rest .InClusterConfig ()
63+ if err != nil {
64+ return nil , err
65+ }
66+ client , err := kubernetes .NewForConfig (clusterConfig )
67+ if err != nil {
68+ return nil , err
69+ }
70+ k8sKeychain , err := kubernetesauth .New (ctx , client , kubernetesauth.Options {
5671 ServiceAccountName : m .serviceAccountName ,
5772 Namespace : m .namespace ,
5873 })
5974 if err != nil {
60- return nil , fmt . Errorf ( "authenticate: %w" , err )
75+ return nil , err
6176 }
6277
63- return keychain , nil
78+ // Order matters here: We want to go through all of the cloud provider keychains before we hit the default keychain (docker config.json)
79+ return authn .NewMultiKeychain (
80+ k8sKeychain ,
81+ google .Keychain ,
82+ amazonKeychain ,
83+ azureKeychain ,
84+ authn .DefaultKeychain ,
85+ ), nil
6486}
6587
6688type podMetadata struct {
0 commit comments