diff --git a/pkg/compiler/backend/simpledocker.go b/pkg/compiler/backend/simpledocker.go index 437b7b48..9060a94e 100644 --- a/pkg/compiler/backend/simpledocker.go +++ b/pkg/compiler/backend/simpledocker.go @@ -90,6 +90,19 @@ func (*SimpleDocker) DownloadImage(opts compiler.CompilerBackendOptions) error { return nil } +func (*SimpleDocker) ImageExists(imagename string) bool { + buildarg := []string{"inspect", "--type=image", imagename} + Debug(":whale: Checking existance of docker image: " + imagename) + cmd := exec.Command("docker", buildarg...) + out, err := cmd.CombinedOutput() + if err != nil { + Warning("Image not present") + Debug(out) + return false + } + return true +} + func (*SimpleDocker) RemoveImage(opts compiler.CompilerBackendOptions) error { name := opts.ImageName buildarg := []string{"rmi", name} diff --git a/pkg/compiler/backend/simpleimg.go b/pkg/compiler/backend/simpleimg.go index 23edb493..608149e0 100644 --- a/pkg/compiler/backend/simpleimg.go +++ b/pkg/compiler/backend/simpleimg.go @@ -97,6 +97,13 @@ func (*SimpleImg) CopyImage(src, dst string) error { return nil } +func (*SimpleImg) ImageExists(imagename string) bool { + // NOOP: not implemented + // TODO: Since img doesn't have an inspect command, + // we need to parse the ls output manually + return false +} + func (s *SimpleImg) ImageDefinitionToTar(opts compiler.CompilerBackendOptions) error { if err := s.BuildImage(opts); err != nil { return errors.Wrap(err, "Failed building image") diff --git a/pkg/compiler/compiler.go b/pkg/compiler/compiler.go index 00a864e1..f633a6c6 100644 --- a/pkg/compiler/compiler.go +++ b/pkg/compiler/compiler.go @@ -229,8 +229,16 @@ func (cs *LuetCompiler) stripIncludesFromRootfs(includes []string, rootfs string } func (cs *LuetCompiler) compileWithImage(image, buildertaggedImage, packageImage string, concurrency int, keepPermissions, keepImg bool, p CompilationSpec) (Artifact, error) { + fp := p.GetPackage().HashFingerprint() + if buildertaggedImage == "" { + buildertaggedImage = cs.ImageRepository + "-" + fp + "-builder" + } + if packageImage == "" { + packageImage = cs.ImageRepository + "-" + fp + } if !cs.Clean { - if art, err := LoadArtifactFromYaml(p); err == nil { + exists := cs.Backend.ImageExists(buildertaggedImage) && cs.Backend.ImageExists(packageImage) + if art, err := LoadArtifactFromYaml(p); err == nil && exists { Debug("Artifact reloaded. Skipping build") return art, err } @@ -265,14 +273,6 @@ func (cs *LuetCompiler) compileWithImage(image, buildertaggedImage, packageImage } } - fp := p.GetPackage().HashFingerprint() - if buildertaggedImage == "" { - buildertaggedImage = cs.ImageRepository + "-" + fp + "-builder" - } - if packageImage == "" { - packageImage = cs.ImageRepository + "-" + fp - } - Info(pkgTag, "Generating :whale: definition for builder image from", image) // First we create the builder image diff --git a/pkg/compiler/interface.go b/pkg/compiler/interface.go index 9a4c22c6..44298ca2 100644 --- a/pkg/compiler/interface.go +++ b/pkg/compiler/interface.go @@ -82,6 +82,8 @@ type CompilerBackend interface { DownloadImage(opts CompilerBackendOptions) error Push(opts CompilerBackendOptions) error + + ImageExists(string) bool } type Artifact interface {