in tools/lib/image/image.go [43:82]
func Generate(size uint64, numLayers int) (name string, err error) {
dir, err := ioutil.TempDir("", "")
if err != nil {
return "", fmt.Errorf("temp dir: %s", err)
}
defer os.RemoveAll(dir)
name = fmt.Sprintf("kraken-test-image-%s", filepath.Base(dir))
dockerfile, err := os.Create(fmt.Sprintf("%s/Dockerfile", dir))
if err != nil {
return "", fmt.Errorf("create dockerfile: %s", err)
}
log.Printf("Generating dockerfile %s", dockerfile.Name())
if _, err := fmt.Fprintln(dockerfile, "FROM scratch"); err != nil {
return "", fmt.Errorf("fprint dockerfile: %s", err)
}
layerSize := size / uint64(numLayers)
for i := 0; i < numLayers; i++ {
f, err := os.Create(fmt.Sprintf("%s/file_%d", dir, i))
if err != nil {
return "", fmt.Errorf("create file: %s", err)
}
r := io.LimitReader(rand.New(rand.NewSource(time.Now().Unix())), int64(layerSize))
if _, err := io.Copy(f, r); err != nil {
return "", fmt.Errorf("copy rand: %s", err)
}
layerName := filepath.Base(f.Name())
if _, err := fmt.Fprintf(dockerfile, "COPY %s /\n", layerName); err != nil {
return "", fmt.Errorf("fprint dockerfile: %s", err)
}
}
if err := run("sudo", "docker", "build", "-t", name, dir); err != nil {
return "", err
}
return name + ":latest", nil
}