add contextDir to tar on remote

podman build fails on remote build when using a relative context directory.
This is because the context dir was not being added to the tar, so when remote
the compat build function would not be able to stat the contextDir.

resolves #13293

Signed-off-by: cdoern <cbdoer23@g.holycross.edu>
This commit is contained in:
cdoern
2022-03-15 12:13:41 -04:00
parent e59f71d230
commit 5e1e13c18c
2 changed files with 22 additions and 9 deletions

View File

@ -241,7 +241,9 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO
params.Add("platform", platform) params.Add("platform", platform)
} }
} }
if contextDir, err := filepath.EvalSymlinks(options.ContextDirectory); err == nil { var err error
var contextDir string
if contextDir, err = filepath.EvalSymlinks(options.ContextDirectory); err == nil {
options.ContextDirectory = contextDir options.ContextDirectory = contextDir
} }
@ -301,7 +303,6 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO
var ( var (
headers http.Header headers http.Header
err error
) )
if options.SystemContext != nil && options.SystemContext.DockerAuthConfig != nil { if options.SystemContext != nil && options.SystemContext.DockerAuthConfig != nil {
headers, err = auth.MakeXRegistryAuthHeader(options.SystemContext, options.SystemContext.DockerAuthConfig.Username, options.SystemContext.DockerAuthConfig.Password) headers, err = auth.MakeXRegistryAuthHeader(options.SystemContext, options.SystemContext.DockerAuthConfig.Username, options.SystemContext.DockerAuthConfig.Password)
@ -325,7 +326,7 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO
} }
} }
contextDir, err := filepath.Abs(options.ContextDirectory) contextDir, err = filepath.Abs(options.ContextDirectory)
if err != nil { if err != nil {
logrus.Errorf("Cannot find absolute path of %v: %v", options.ContextDirectory, err) logrus.Errorf("Cannot find absolute path of %v: %v", options.ContextDirectory, err)
return nil, err return nil, err
@ -556,16 +557,27 @@ func nTar(excludes []string, sources ...string) (io.ReadCloser, error) {
merr = multierror.Append(merr, err) merr = multierror.Append(merr, err)
return return
} }
err = filepath.Walk(s, func(path string, info os.FileInfo, err error) error { err = filepath.Walk(s, func(path string, info os.FileInfo, err error) error {
if err != nil { if err != nil {
return err return err
} }
if path == s { // check if what we are given is an empty dir, if so then continue w/ it. Else return.
return nil // skip root dir // if we are given a file or a symlink, we do not want to exclude it.
if info.IsDir() && s == path {
var p *os.File
p, err = os.Open(path)
if err != nil {
return err
}
defer p.Close()
_, err = p.Readdir(1)
if err != io.EOF {
return nil // non empty root dir, need to return
} else if err != nil {
logrus.Errorf("Error while reading directory %v: %v", path, err)
}
} }
name := filepath.ToSlash(strings.TrimPrefix(path, s+string(filepath.Separator))) name := filepath.ToSlash(strings.TrimPrefix(path, s+string(filepath.Separator)))
excluded, err := pm.Matches(name) // nolint:staticcheck excluded, err := pm.Matches(name) // nolint:staticcheck

View File

@ -734,10 +734,11 @@ RUN ls /dev/test1`, ALPINE)
err = os.Mkdir("relative", 0755) err = os.Mkdir("relative", 0755)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
containerFilePath := filepath.Join("relative", "Containerfile") containerFilePath := filepath.Join("relative", "Containerfile")
fmt.Println(containerFilePath) err = os.Mkdir("relative/build-root", 0755)
Expect(err).To(BeNil())
err = ioutil.WriteFile(containerFilePath, []byte(containerFile), 0755) err = ioutil.WriteFile(containerFilePath, []byte(containerFile), 0755)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
build := podmanTest.Podman([]string{"build", "-f", "./relative/Containerfile"}) build := podmanTest.Podman([]string{"build", "-f", "./relative/Containerfile", "./relative/build-root"})
build.WaitWithDefaultTimeout() build.WaitWithDefaultTimeout()
Expect(build).To(Exit(0)) Expect(build).To(Exit(0))
err = os.RemoveAll("relative") err = os.RemoveAll("relative")