@@ -50,12 +50,14 @@ func NewOCIRemoteLoader(dockerCli command.Cli, offline bool) loader.ResourceLoad
5050 return ociRemoteLoader {
5151 dockerCli : dockerCli ,
5252 offline : offline ,
53+ known : map [string ]string {},
5354 }
5455}
5556
5657type ociRemoteLoader struct {
5758 dockerCli command.Cli
5859 offline bool
60+ known map [string ]string
5961}
6062
6163const prefix = "oci://"
@@ -77,42 +79,51 @@ func (g ociRemoteLoader) Load(ctx context.Context, path string) (string, error)
7779 return "" , nil
7880 }
7981
80- ref , err := reference .ParseDockerRef (path [len (prefix ):])
81- if err != nil {
82- return "" , err
83- }
84-
85- opt , err := storeutil .GetImageConfig (g .dockerCli , nil )
86- if err != nil {
87- return "" , err
88- }
89- resolver := imagetools .New (opt )
90-
91- content , descriptor , err := resolver .Get (ctx , ref .String ())
92- if err != nil {
93- return "" , err
94- }
82+ local , ok := g .known [path ]
83+ if ! ok {
84+ ref , err := reference .ParseDockerRef (path [len (prefix ):])
85+ if err != nil {
86+ return "" , err
87+ }
9588
96- cache , err := cacheDir ()
97- if err != nil {
98- return "" , fmt .Errorf ("initializing remote resource cache: %w" , err )
99- }
89+ opt , err := storeutil .GetImageConfig (g .dockerCli , nil )
90+ if err != nil {
91+ return "" , err
92+ }
93+ resolver := imagetools .New (opt )
10094
101- local := filepath .Join (cache , descriptor .Digest .Hex ())
102- composeFile := filepath .Join (local , "compose.yaml" )
103- if _ , err = os .Stat (local ); os .IsNotExist (err ) {
104- var manifest v1.Manifest
105- err = json .Unmarshal (content , & manifest )
95+ content , descriptor , err := resolver .Get (ctx , ref .String ())
10696 if err != nil {
10797 return "" , err
10898 }
10999
110- err2 := g .pullComposeFiles (ctx , local , composeFile , manifest , ref , resolver )
111- if err2 != nil {
112- return "" , err2
100+ cache , err := cacheDir ()
101+ if err != nil {
102+ return "" , fmt .Errorf ("initializing remote resource cache: %w" , err )
103+ }
104+
105+ local = filepath .Join (cache , descriptor .Digest .Hex ())
106+ composeFile := filepath .Join (local , "compose.yaml" )
107+ if _ , err = os .Stat (local ); os .IsNotExist (err ) {
108+ var manifest v1.Manifest
109+ err = json .Unmarshal (content , & manifest )
110+ if err != nil {
111+ return "" , err
112+ }
113+
114+ err2 := g .pullComposeFiles (ctx , local , composeFile , manifest , ref , resolver )
115+ if err2 != nil {
116+ return "" , err2
117+ }
113118 }
119+ g .known [path ] = local
114120 }
115- return composeFile , nil
121+
122+ return filepath .Join (local , "compose.yaml" ), nil
123+ }
124+
125+ func (g ociRemoteLoader ) Dir (path string ) string {
126+ return g .known [path ]
116127}
117128
118129func (g ociRemoteLoader ) pullComposeFiles (ctx context.Context , local string , composeFile string , manifest v1.Manifest , ref reference.Named , resolver * imagetools.Resolver ) error {
0 commit comments