From 6a9c405b8c7635e9e4b129f8f2a04f34288c2609 Mon Sep 17 00:00:00 2001 From: Johan Brandhorst Date: Mon, 2 Dec 2019 16:48:31 +0000 Subject: [PATCH 1/3] runtimes/podman: recursively create dirs Recursively create directories for any uploaded files, should they not already exist. --- runtimes/podman/file.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/runtimes/podman/file.go b/runtimes/podman/file.go index 2e5bfc3..02381d5 100644 --- a/runtimes/podman/file.go +++ b/runtimes/podman/file.go @@ -2,6 +2,7 @@ package podman import ( "context" + "errors" "fmt" "io" "os" @@ -40,6 +41,12 @@ func uploadFile(ctx context.Context, mountDir string, file podrick.File) (err er return fmt.Errorf("file paths must be absolute: %q", file.Path) } dest := filepath.Join(mountDir, path) + if _, err := os.Stat(filepath.Dir(dest)); errors.Is(err, os.ErrNotExist) { + err := os.MkdirAll(filepath.Dir(dest), 0644) + if err != nil { + return fmt.Errorf("failed to create parent directory: %w", err) + } + } target, err := os.Create(dest) if err != nil { return fmt.Errorf("failed to create file: %w", err) From 36010d5e6a02b5ae314802f8bab5a4a9e882acaa Mon Sep 17 00:00:00 2001 From: Johan Brandhorst Date: Mon, 2 Dec 2019 17:02:54 +0000 Subject: [PATCH 2/3] runtimes/podman: use silly file permissions This works around some permission errors --- runtimes/podman/file.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtimes/podman/file.go b/runtimes/podman/file.go index 02381d5..27d348f 100644 --- a/runtimes/podman/file.go +++ b/runtimes/podman/file.go @@ -42,7 +42,7 @@ func uploadFile(ctx context.Context, mountDir string, file podrick.File) (err er } dest := filepath.Join(mountDir, path) if _, err := os.Stat(filepath.Dir(dest)); errors.Is(err, os.ErrNotExist) { - err := os.MkdirAll(filepath.Dir(dest), 0644) + err := os.MkdirAll(filepath.Dir(dest), 0777) if err != nil { return fmt.Errorf("failed to create parent directory: %w", err) } From 0df91bbaf8a3ece54f0760db0e6b95ce63d5be3d Mon Sep 17 00:00:00 2001 From: Johan Brandhorst Date: Mon, 2 Dec 2019 17:12:50 +0000 Subject: [PATCH 3/3] Add file mode to File --- config.go | 8 ++++++-- runtimes/docker/file.go | 2 +- runtimes/podman/file.go | 5 +++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/config.go b/config.go index a99008a..3228231 100644 --- a/config.go +++ b/config.go @@ -1,6 +1,9 @@ package podrick -import "io" +import ( + "io" + "os" +) // ContainerConfig is used by runtimes to start // containers. @@ -26,9 +29,10 @@ type Ulimit struct { } // File describes a file in a container. -// All fields are mandatory +// All fields are mandatory. type File struct { Content io.Reader Path string Size int + Mode os.FileMode } diff --git a/runtimes/docker/file.go b/runtimes/docker/file.go index fffb432..9299a3c 100644 --- a/runtimes/docker/file.go +++ b/runtimes/docker/file.go @@ -33,7 +33,7 @@ func uploadFiles(ctx context.Context, client *docker.Client, cID string, files . } err = archive.WriteHeader(&tar.Header{ Name: f.Path, - Mode: 0644, + Mode: int64(f.Mode), Size: int64(f.Size), }) if err != nil { diff --git a/runtimes/podman/file.go b/runtimes/podman/file.go index 27d348f..11a45fe 100644 --- a/runtimes/podman/file.go +++ b/runtimes/podman/file.go @@ -62,5 +62,10 @@ func uploadFile(ctx context.Context, mountDir string, file podrick.File) (err er return fmt.Errorf("failed to copy file contents: %w", err) } + err = os.Chmod(dest, file.Mode) + if err != nil { + return fmt.Errorf("failed to set file permissions: %w", err) + } + return nil }