From 2245ffa0425fe66adf91772658f8c1be9f2b510d Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Mon, 14 May 2018 22:09:48 -0400 Subject: [PATCH] save an image filesystem layers --- main.go | 65 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index 7bae80c..d23ba4f 100644 --- a/main.go +++ b/main.go @@ -1,13 +1,60 @@ package main import ( + "bufio" "encoding/json" "fmt" + "io" + "os" "github.com/docker/docker/client" "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() { ctx := context.Background() cli, err := client.NewEnvClient() @@ -18,21 +65,20 @@ func main() { // imageID := "golang:alpine" imageID := "die-test:latest" + fmt.Println("Saving Image...") + readCloser, err := cli.ImageSave(ctx, []string{imageID}) + check(err) + saveImage(readCloser) + for { inspect, _, err := cli.ImageInspectWithRaw(ctx, imageID) - if err != nil { - panic(err) - } + check(err) history, err := cli.ImageHistory(ctx, imageID) - if err != nil { - panic(err) - } + check(err) historyStr, err := json.MarshalIndent(history, "", " ") - if err != nil { - panic(err) - } + check(err) layerStr := "" for idx, layer := range inspect.RootFS.Layers { @@ -53,4 +99,5 @@ func main() { imageID = inspect.Parent } } + fmt.Println("See './image' for the cached image tar") }