save an image filesystem layers

This commit is contained in:
Alex Goodman 2018-05-14 22:09:48 -04:00
parent 8f16cb8a71
commit 2245ffa042
No known key found for this signature in database
GPG Key ID: 05328C611D8A520E

65
main.go
View File

@ -1,13 +1,60 @@
package main package main
import ( import (
"bufio"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"os"
"github.com/docker/docker/client" "github.com/docker/docker/client"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
func check(e error) {
if e != nil {
panic(e)
}
}
func saveImage(readCloser io.ReadCloser) {
defer readCloser.Close()
path := "image"
if _, err := os.Stat(path); os.IsNotExist(err) {
os.Mkdir(path, 0755)
}
fo, err := os.Create("image/cache.tar")
check(err)
defer func() {
if err := fo.Close(); err != nil {
panic(err)
}
}()
w := bufio.NewWriter(fo)
buf := make([]byte, 1024)
for {
n, err := readCloser.Read(buf)
if err != nil && err != io.EOF {
panic(err)
}
if n == 0 {
break
}
if _, err := w.Write(buf[:n]); err != nil {
panic(err)
}
}
if err = w.Flush(); err != nil {
panic(err)
}
}
func main() { func main() {
ctx := context.Background() ctx := context.Background()
cli, err := client.NewEnvClient() cli, err := client.NewEnvClient()
@ -18,21 +65,20 @@ func main() {
// imageID := "golang:alpine" // imageID := "golang:alpine"
imageID := "die-test:latest" imageID := "die-test:latest"
fmt.Println("Saving Image...")
readCloser, err := cli.ImageSave(ctx, []string{imageID})
check(err)
saveImage(readCloser)
for { for {
inspect, _, err := cli.ImageInspectWithRaw(ctx, imageID) inspect, _, err := cli.ImageInspectWithRaw(ctx, imageID)
if err != nil { check(err)
panic(err)
}
history, err := cli.ImageHistory(ctx, imageID) history, err := cli.ImageHistory(ctx, imageID)
if err != nil { check(err)
panic(err)
}
historyStr, err := json.MarshalIndent(history, "", " ") historyStr, err := json.MarshalIndent(history, "", " ")
if err != nil { check(err)
panic(err)
}
layerStr := "" layerStr := ""
for idx, layer := range inspect.RootFS.Layers { for idx, layer := range inspect.RootFS.Layers {
@ -53,4 +99,5 @@ func main() {
imageID = inspect.Parent imageID = inspect.Parent
} }
} }
fmt.Println("See './image' for the cached image tar")
} }