// ShowBaseImage will show details about the base BOSH images func (f *Fissile) ShowBaseImage(repository string) error { dockerManager, err := docker.NewImageManager() if err != nil { return fmt.Errorf("Error connecting to docker: %s", err.Error()) } comp, err := compilator.NewCompilator(dockerManager, "", "", repository, compilation.UbuntuBase, f.Version, false, f.UI) if err != nil { return fmt.Errorf("Error creating a new compilator: %s", err.Error()) } image, err := dockerManager.FindImage(comp.BaseImageName()) if err != nil { return fmt.Errorf("Error looking up base image %s: %s", comp.BaseImageName(), err.Error()) } f.UI.Printf("\nCompilation Layer: %s\n", color.GreenString(comp.BaseImageName())) f.UI.Printf("ID: %s\n", color.GreenString(image.ID)) f.UI.Printf("Virtual Size: %sMB\n", color.YellowString("%.2f", float64(image.VirtualSize)/(1024*1024))) baseImageName := builder.GetBaseImageName(repository, f.Version) image, err = dockerManager.FindImage(baseImageName) f.UI.Printf("\nStemcell Layer: %s\n", color.GreenString(baseImageName)) f.UI.Printf("ID: %s\n", color.GreenString(image.ID)) f.UI.Printf("Virtual Size: %sMB\n", color.YellowString("%.2f", float64(image.VirtualSize)/(1024*1024))) return nil }
// GenerateBaseDockerImage generates a base docker image to be used as a FROM for role images func (f *Fissile) GenerateBaseDockerImage(targetPath, baseImage, metricsPath string, noBuild bool, repository string) error { if metricsPath != "" { stampy.Stamp(metricsPath, "fissile", "create-role-base", "start") defer stampy.Stamp(metricsPath, "fissile", "create-role-base", "done") } dockerManager, err := docker.NewImageManager() if err != nil { return fmt.Errorf("Error connecting to docker: %s", err.Error()) } baseImageName := builder.GetBaseImageName(repository, f.Version) image, err := dockerManager.FindImage(baseImageName) if err == docker.ErrImageNotFound { f.UI.Println("Image doesn't exist, it will be created ...") } else if err != nil { return fmt.Errorf("Error looking up image: %s", err.Error()) } else { f.UI.Println(color.GreenString( "Base role image %s with ID %s already exists. Doing nothing.", color.YellowString(baseImageName), color.YellowString(image.ID), )) return nil } if !strings.HasSuffix(targetPath, string(os.PathSeparator)) { targetPath = fmt.Sprintf("%s%c", targetPath, os.PathSeparator) } baseImageBuilder := builder.NewBaseImageBuilder(baseImage) if noBuild { f.UI.Println("Skipping image build because of flag.") return nil } f.UI.Println("Building base docker image ...") log := new(bytes.Buffer) stdoutWriter := docker.NewFormattingWriter( log, docker.ColoredBuildStringFunc(baseImageName), ) tarPopulator := baseImageBuilder.NewDockerPopulator() err = dockerManager.BuildImageFromCallback(baseImageName, stdoutWriter, tarPopulator) if err != nil { log.WriteTo(f.UI) return fmt.Errorf("Error building base image: %s", err) } f.UI.Println(color.GreenString("Done.")) return nil }
// GeneratePackagesRoleImage builds the docker image for the packages layer // where all packages are included func (f *Fissile) GeneratePackagesRoleImage(repository string, roleManifest *model.RoleManifest, noBuild, force bool, packagesImageBuilder *builder.PackagesImageBuilder) error { if len(f.releases) == 0 { return fmt.Errorf("Releases not loaded") } dockerManager, err := docker.NewImageManager() if err != nil { return fmt.Errorf("Error connecting to docker: %s", err.Error()) } packagesLayerImageName := packagesImageBuilder.GetRolePackageImageName(roleManifest) if !force { if hasImage, err := dockerManager.HasImage(packagesLayerImageName); err == nil && hasImage { f.UI.Printf("Packages layer %s already exists. Skipping ...\n", color.YellowString(packagesLayerImageName)) return nil } } baseImageName := builder.GetBaseImageName(repository, f.Version) if hasImage, err := dockerManager.HasImage(baseImageName); err != nil { return fmt.Errorf("Error getting base image: %s", err) } else if !hasImage { return fmt.Errorf("Failed to find role base %s, did you build it first?", baseImageName) } if noBuild { f.UI.Println("Skipping packages layer docker image build because of --no-build flag.") return nil } f.UI.Printf("Building packages layer docker image %s ...\n", color.YellowString(packagesLayerImageName)) log := new(bytes.Buffer) stdoutWriter := docker.NewFormattingWriter( log, docker.ColoredBuildStringFunc(packagesLayerImageName), ) tarPopulator := packagesImageBuilder.NewDockerPopulator(roleManifest, force) err = dockerManager.BuildImageFromCallback(packagesLayerImageName, stdoutWriter, tarPopulator) if err != nil { log.WriteTo(f.UI) return fmt.Errorf("Error building packages layer docker image: %s", err.Error()) } f.UI.Println(color.GreenString("Done.")) return nil }