Why does kubectl cp command terminates with exit code 126?

Viewed 10324

I am trying to copy files from the pod to local using following command:

kubectl cp /namespace/pod_name:/path/in/pod /path/in/local

But the command terminates with exit code 126 and copy doesn't take place.

Similarly while trying from local to pod using following command:

kubectl cp /path/in/local /namespace/pod_name:/path/in/pod

It throws the following error:

OCI runtime exec failed: exec failed: container_linux.go:367: starting container process caused: exec: "tar": executable file not found in $PATH: unknown

Please help through this.

5 Answers

kubectl cp is actually a very small wrapper around kubectl exec whatever tar c | tar x. A side effect of this is that you need a working tar executable in the target container, which you do not appear to have.

In general kubectl cp is best avoided, it's usually only good for weird debugging stuff.

kubectl cp requires the tar to be present in your container, as the help says:

!!!Important Note!!! Requires that the 'tar' binary is present in your container image. If 'tar' is not present, 'kubectl cp' will fail.

Make sure your container contains the tar binary in its $PATH

An alternative way to copy a file from local filesystem into a container:

cat [local file path] | kubectl exec -i -n [namespace] [pod] -c [container] "--" sh -c "cat > [remote file path]"

Useful command to copy the file from pod to local

kubectl exec -n <namespace> <pod> -- cat <filename with path>  > <filename>

For me the cat worked like this:

cat <file name> | kubectl exec -i <pod-id> -- sh -c "cat > <filename>"

Example:

cat file.json | kubectl exec -i server-77b7976cc7-x25s8 -- sh -c "cat > /tmp/file.json"

Didn't need to specify namespace since I run the command from a specific project, and since we have one container, didn't need to specify it

Related