@@ -20,6 +20,10 @@ import (
20
20
"encoding/hex"
21
21
"net/http"
22
22
"os"
23
+ "strings"
24
+
25
+ v1 "github.com/google/go-containerregistry/pkg/v1"
26
+ "github.com/google/go-containerregistry/pkg/v1/tarball"
23
27
24
28
"github.com/containerd/containerd/images"
25
29
luetimages "github.com/mudler/luet/pkg/api/core/image"
@@ -42,6 +46,11 @@ import (
42
46
"github.com/theupdateframework/notary/tuf/data"
43
47
)
44
48
49
+ const (
50
+ filePrefix = "file://"
51
+ fileImageSeparator = ":/"
52
+ )
53
+
45
54
// See also https://github.com/docker/cli/blob/88c6089300a82d3373892adf6845a4fed1a4ba8d/cli/command/image/trust.go#L171
46
55
47
56
func verifyImage (image string , authConfig * types.AuthConfig ) (string , error ) {
@@ -196,18 +205,26 @@ func DownloadAndExtractDockerImage(ctx luettypes.Context, image, dest string, au
196
205
}
197
206
198
207
func ExtractDockerImage (ctx luettypes.Context , local , dest string ) (* images.Image , error ) {
208
+ var img v1.Image
199
209
if ! fileHelper .Exists (dest ) {
200
210
if err := os .MkdirAll (dest , os .ModePerm ); err != nil {
201
211
return nil , errors .Wrapf (err , "cannot create destination directory" )
202
212
}
203
213
}
204
214
205
- ref , err := name .ParseReference (local )
206
- if err != nil {
207
- return nil , err
215
+ var err error
216
+ if strings .HasPrefix (local , filePrefix ) {
217
+ parts := strings .Split (local , fileImageSeparator )
218
+ if len (parts ) == 2 && parts [1 ] != "" {
219
+ img , err = tarball .ImageFromPath (parts [1 ], nil )
220
+ }
221
+ } else {
222
+ ref , err := name .ParseReference (local )
223
+ if err != nil {
224
+ return nil , err
225
+ }
226
+ img , err = daemon .Image (ref )
208
227
}
209
-
210
- img , err := daemon .Image (ref )
211
228
if err != nil {
212
229
return nil , err
213
230
}
0 commit comments