dive-zfs/image/image.go
William Murphy 78f02465e2 Small clean ups (#5)
* Fix two small compiler errors

Apparently, in go, `fmt.Prntln("\n")` is a build error - you can't
have a redundant newline there. Also, we had the wrong format string
somewhere.

* Use $GOPATH to find dep

When I first pulled this branch, all the tests failed because,
although `dep` was being installed to my local machine, it wasn't
being added to $PATH. Rather than mess with $PATH, I decided to
add $GOPATH/bin to the beginning of the invocation.
2018-06-04 22:10:39 -04:00

105 lines
1.8 KiB
Go

package image
import (
"io"
"os"
"bufio"
"github.com/docker/docker/client"
"fmt"
"encoding/json"
"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 WriteImage() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// 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)
check(err)
history, err := cli.ImageHistory(ctx, imageID)
check(err)
historyStr, err := json.MarshalIndent(history, "", " ")
check(err)
layerStr := ""
for idx, layer := range inspect.RootFS.Layers {
prefix := "├── "
if idx == len(inspect.RootFS.Layers)-1 {
prefix = "└── "
}
layerStr += fmt.Sprintf("%s%s\n", prefix, layer)
}
fmt.Printf("Image: %s\nId: %s\nParent: %s\nLayers: %d\n%sHistory: %s\n", imageID, inspect.ID, inspect.Parent, len(inspect.RootFS.Layers), layerStr, historyStr)
fmt.Println("")
if inspect.Parent == "" {
break
} else {
imageID = inspect.Parent
}
}
fmt.Println("See './.image' for the cached image tar")
}