Skip to content
This repository was archived by the owner on Dec 2, 2020. It is now read-only.

Commit fcf11f8

Browse files
committed
Move image packing into separate file
1 parent 2f3adaa commit fcf11f8

File tree

2 files changed

+84
-78
lines changed

2 files changed

+84
-78
lines changed

main.go

Lines changed: 1 addition & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,14 @@
11
package main
22

33
import (
4-
"context"
54
"fmt"
65
"os"
7-
"path/filepath"
8-
9-
"github.com/containers/image/image"
10-
"github.com/containers/image/pkg/blobinfocache"
11-
"github.com/containers/image/transports/alltransports"
12-
"github.com/containers/image/types"
13-
"github.com/pkg/errors"
146
)
157

168
func main() {
17-
err := ConvertImage("docker-daemon:lambda-php:latest")
9+
err := RepackImage("docker-daemon:lambda-php:latest")
1810
if err != nil {
1911
fmt.Printf("Error: %+v", err)
2012
os.Exit(1)
2113
}
2214
}
23-
24-
// Converts container image to Lambda layers
25-
func ConvertImage(name string) (retErr error) {
26-
// Get image's layer data from image name
27-
ref, err := alltransports.ParseImageName(name)
28-
if err != nil {
29-
return err
30-
}
31-
32-
sys := &types.SystemContext{}
33-
34-
ctx := context.Background()
35-
36-
cache := blobinfocache.DefaultCache(sys)
37-
38-
rawSource, err := ref.NewImageSource(ctx, sys)
39-
if err != nil {
40-
return err
41-
}
42-
43-
src, err := image.FromSource(ctx, sys, rawSource)
44-
if err != nil {
45-
if closeErr := rawSource.Close(); closeErr != nil {
46-
return errors.Wrapf(err, " (close error: %v)", closeErr)
47-
}
48-
49-
return err
50-
}
51-
defer func() {
52-
if err := src.Close(); err != nil {
53-
retErr = errors.Wrapf(retErr, " (close error: %v)", err)
54-
}
55-
}()
56-
57-
layerInfos := src.LayerInfos()
58-
59-
// Unpack and inspect each image layer, copy relevant files to new Lambda layer
60-
dir, err := os.Getwd()
61-
if err != nil {
62-
return err
63-
}
64-
layerOutputDir := filepath.Join(dir, "image-output", name)
65-
if err := os.MkdirAll(layerOutputDir, 0777); err != nil {
66-
return err
67-
}
68-
69-
lambdaLayerNum := 1
70-
71-
for _, layerInfo := range layerInfos {
72-
lambdaLayerFilename := filepath.Join(layerOutputDir, fmt.Sprintf("layer-%d.zip", lambdaLayerNum))
73-
74-
layerStream, _, err := rawSource.GetBlob(ctx, layerInfo, cache)
75-
if err != nil {
76-
return err
77-
}
78-
defer layerStream.Close()
79-
80-
fileCreated, err := RepackLayer(lambdaLayerFilename, layerStream)
81-
if err != nil {
82-
return err
83-
}
84-
85-
if fileCreated {
86-
lambdaLayerNum++
87-
}
88-
}
89-
90-
return nil
91-
}

repack_image.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"path/filepath"
8+
9+
"github.com/containers/image/image"
10+
"github.com/containers/image/pkg/blobinfocache"
11+
"github.com/containers/image/transports/alltransports"
12+
"github.com/containers/image/types"
13+
"github.com/pkg/errors"
14+
)
15+
16+
// Converts container image to Lambda layers
17+
func RepackImage(imageName string) (retErr error) {
18+
// Get image's layer data from image name
19+
ref, err := alltransports.ParseImageName(imageName)
20+
if err != nil {
21+
return err
22+
}
23+
24+
sys := &types.SystemContext{}
25+
26+
ctx := context.Background()
27+
28+
cache := blobinfocache.DefaultCache(sys)
29+
30+
rawSource, err := ref.NewImageSource(ctx, sys)
31+
if err != nil {
32+
return err
33+
}
34+
35+
src, err := image.FromSource(ctx, sys, rawSource)
36+
if err != nil {
37+
if closeErr := rawSource.Close(); closeErr != nil {
38+
return errors.Wrapf(err, " (close error: %v)", closeErr)
39+
}
40+
41+
return err
42+
}
43+
defer func() {
44+
if err := src.Close(); err != nil {
45+
retErr = errors.Wrapf(retErr, " (close error: %v)", err)
46+
}
47+
}()
48+
49+
layerInfos := src.LayerInfos()
50+
51+
// Unpack and inspect each image layer, copy relevant files to new Lambda layer
52+
dir, err := os.Getwd()
53+
if err != nil {
54+
return err
55+
}
56+
layerOutputDir := filepath.Join(dir, "image-output", imageName)
57+
if err := os.MkdirAll(layerOutputDir, 0777); err != nil {
58+
return err
59+
}
60+
61+
lambdaLayerNum := 1
62+
63+
for _, layerInfo := range layerInfos {
64+
lambdaLayerFilename := filepath.Join(layerOutputDir, fmt.Sprintf("layer-%d.zip", lambdaLayerNum))
65+
66+
layerStream, _, err := rawSource.GetBlob(ctx, layerInfo, cache)
67+
if err != nil {
68+
return err
69+
}
70+
defer layerStream.Close()
71+
72+
fileCreated, err := RepackLayer(lambdaLayerFilename, layerStream)
73+
if err != nil {
74+
return err
75+
}
76+
77+
if fileCreated {
78+
lambdaLayerNum++
79+
}
80+
}
81+
82+
return nil
83+
}

0 commit comments

Comments
 (0)