diff --git a/aci-builder/bin-run/builder.go b/aci-builder/bin-run/builder.go index 56455238..4740e2d1 100644 --- a/aci-builder/bin-run/builder.go +++ b/aci-builder/bin-run/builder.go @@ -136,39 +136,36 @@ func (b *Builder) tarAci() error { } upperPath := b.pod.Root + PATH_OVERLAY + "/" + upperId + PATH_UPPER - upperNamedRootfs := upperPath + "/" + manifestApp(b.pod).Name.String() - upperRootfs := upperPath + common.PathRootfs - - if err := os.RemoveAll(upperNamedRootfs + PATH_TMP); err != nil { - logs.WithEF(err, b.fields.WithField("path", upperNamedRootfs+PATH_TMP)).Warn("Failed to clean tmp directory") - } - - if err := os.Rename(upperNamedRootfs, upperRootfs); err != nil { // TODO this is dirty and can probably be renamed during tar - return errs.WithEF(err, b.fields.WithField("path", upperNamedRootfs), "Failed to rename rootfs") - } - defer os.Rename(upperRootfs, upperNamedRootfs) - - dir, err := os.Getwd() - if err != nil { - return errs.WithEF(err, b.fields, "Failed to get current working directory") - } - defer func() { - if err := os.Chdir(dir); err != nil { - logs.WithEF(err, b.fields.WithField("path", dir)).Warn("Failed to chdir back") + rootfsAlias := manifestApp(b.pod).Name.String() + destination := b.aciTargetPath + common.PathImageAci // absolute dir, outside upperPath (think: /tmp/…) + + params := []string{"--sort=name", "--numeric-owner", "--exclude", rootfsAlias + PATH_TMP + "/*"} + params = append(params, "-C", upperPath, "--transform", "s@^"+rootfsAlias+"@rootfs@") + params = append(params, "-cf", destination, common.PathManifest[1:], rootfsAlias) + + logs.WithF(b.fields).Debug("Calling tar to collect all files") + if err := common.ExecCmd("tar", params...); err != nil { + // In case the host's tar is too old, try the builder's if it exists. + stage1Tar := rktcommon.Stage1RootfsPath(b.pod.Root) + var buildersTar string + for _, t := range []string{"/dgr/usr/bin/tar", "/bin/tar", "/usr/bin/tar"} { + buildersTar = filepath.Join(stage1Tar, t) + if _, err := os.Stat(buildersTar); err == nil { + break + } } - }() - if err := os.Chdir(upperPath); err != nil { - return errs.WithEF(err, b.fields.WithField("path", upperPath), "Failed to chdir to upper base path") - } - if err := common.Tar(b.aciTargetPath+common.PathImageAci, common.PathManifest[1:], common.PathRootfs[1:]+"/"); err != nil { - return errs.WithEF(err, b.fields, "Failed to tar aci") + if err2 := common.ExecCmd(buildersTar, params...); err2 != nil { + // If that failed, output the original error nevertheless. + logs.WithFields(b.fields).WithField("params", params).Debug("Parameters to 'tar' within the builder") + return errs.WithEF(err, b.fields, "Failed to tar aci") + } + logs.WithF(b.fields).Debug("Had to resort to 'tar' from the builder to create the aci file") } // common.ExecCmd sometimes silently fails, hence the redundant check. - if _, err := os.Stat(b.aciTargetPath + common.PathImageAci); os.IsNotExist(err) { + if _, err := os.Stat(destination); os.IsNotExist(err) { return errs.WithEF(err, b.fields, "Expected aci has not been created") } - logs.WithField("path", dir).Debug("chdir") return nil } diff --git a/dgr/common/tar.go b/dgr/common/tar.go deleted file mode 100644 index 1da0af8a..00000000 --- a/dgr/common/tar.go +++ /dev/null @@ -1,11 +0,0 @@ -package common - -func Tar(destination string, source ...string) error { // remove zip - source = append(source, "") - source = append(source, "") - copy(source[2:], source[0:]) - source[0] = "cpf" - source[1] = destination - - return ExecCmd("tar", source...) -}