From f67de000dc26f34ae088d8db7c5d936375c6ba61 Mon Sep 17 00:00:00 2001 From: Akihiro Suda Date: Tue, 24 May 2022 17:54:33 +0900 Subject: [PATCH] archive: add human-readable hint to Lchown error Before: ``` $ nerdctl pull gcr.io/kubeflow-images-public/tensorflow-1.14.0-notebook-cpu:v0.7.0 FATA[0026] failed to extract layer sha256:f8a604834d388fd3d04c26e4ed832b36b617ea8a4e0b1665b9199bd10cfcb171: mount callback failed on /var/lib/containerd/tmpmounts/containerd-mount1818823128: lchown /var/lib/containerd/tmpmounts/containerd-mount1818823128/usr/local/bin/docker-credential-gcr: invalid argument: unknown ``` After: ``` $ nerdctl pull gcr.io/kubeflow-images-public/tensorflow-1.14.0-notebook-cpu:v0.7.0 FATA[0027] failed to extract layer sha256:f8a604834d388fd3d04c26e4ed832b36b617ea8a4e0b1665b9199bd10cfcb171: mount callback failed on /var/lib/containerd/tmpmounts/containerd-mount3521205359: failed to Lchown "/var/lib/containerd/tmpmounts/containerd-mount3521205359/usr/local/bin/docker-credential-gcr" for UID 205001, GID 5000: lchown /var/lib/containerd/tmpmounts/containerd-mount3521205359/usr/local/bin/docker-credential-gcr: invalid argument (Hint: try increasing the number of subordinate IDs in /etc/subuid and /etc/subgid): unknown ``` Related to moby/moby issue 43576 but for containerd Signed-off-by: Akihiro Suda (cherry picked from commit d2f30150b36e999f8f63adb78262e08d8304cfbe) Signed-off-by: Akihiro Suda --- archive/tar.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/archive/tar.go b/archive/tar.go index db27c0e90dc6..eca6316b02d0 100644 --- a/archive/tar.go +++ b/archive/tar.go @@ -19,6 +19,7 @@ package archive import ( "archive/tar" "context" + "fmt" "io" "os" "path/filepath" @@ -29,6 +30,7 @@ import ( "time" "github.com/containerd/containerd/log" + "github.com/containerd/containerd/pkg/userns" "github.com/containerd/continuity/fs" "github.com/pkg/errors" ) @@ -376,6 +378,10 @@ func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header // Lchown is not supported on Windows. if runtime.GOOS != "windows" { if err := os.Lchown(path, hdr.Uid, hdr.Gid); err != nil { + err = fmt.Errorf("failed to Lchown %q for UID %d, GID %d: %w", path, hdr.Uid, hdr.Gid, err) + if errors.Is(err, syscall.EINVAL) && userns.RunningInUserNS() { + err = fmt.Errorf("%w (Hint: try increasing the number of subordinate IDs in /etc/subuid and /etc/subgid)", err) + } return err } }