Yet another DevOps tip for developers. In this article, I will show you how to transfer files between Kubernetes Pods and local system, which is often be your computer.
Transfer files between Kubernetes Pods
Let say you have a running pod named
my-service, which you can verified by running following command:
$ kubectl get pods NAME READY STATUS RESTARTS AGE my-service 1/1 Running 0 6d23h
Transfer files syntax
The Kubernetes you need to use is
kubectl cp. To syntax of the command as following:
$ kubectl help cp Copy files and directories to and from containers. Examples: # !!!Important Note!!! # Requires that the 'tar' binary is present in your container # image. If 'tar' is not present, 'kubectl cp' will fail. # # For advanced use cases, such as symlinks, wildcard expansion or # file mode preservation consider using 'kubectl exec'. # Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace> tar cf - /tmp/foo | kubectl exec -i -n <some-namespace> <some-pod> -- tar xf - -C /tmp/bar # Copy /tmp/foo from a remote pod to /tmp/bar locally kubectl exec -n <some-namespace> <some-pod> -- tar cf - /tmp/foo | tar xf - -C /tmp/bar # Copy /tmp/foo_dir local directory to /tmp/bar_dir in a remote pod in the default namespace kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir # Copy /tmp/foo local file to /tmp/bar in a remote pod in a specific container kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container> # Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace> kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar # Copy /tmp/foo from a remote pod to /tmp/bar locally kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar Options: -c, --container='': Container name. If omitted, the first container in the pod will be chosen --no-preserve=false: The copied file/directory's ownership and permissions will not be preserved in the container Usage: kubectl cp <file-spec-src> <file-spec-dest> [options]
Following are some usage examples of the command.
Copy file from Pod to local
Assuming you have only one container inside the
my-service pod, and you want to get this file
/home/data.csv to your computer, you need to execute following command to get the file from the pod.
$ kubectl cp my-service:/home/data.csv .
The command will get the file from container inside
my-service pod to current directory where you execute the command.
Copy file from local to Pod
Similarly, in order to transfer a local file to a pod in Kubernetes, you will issue this command:
$ kubectl cp ./data.txt my-service:/home/
After that, the
data.txt file at current directory will be transfered into
my-service pod and put inside
/home directory of the first container.
Specify namespace while copying
By default, the command
kubectl cp will locate the
my-service pod in current namespace. However, if you want to specify copying in and out to a pod in different namespace, then you need to specify the namespace before pod name. For examples:
$ kubectl cp my-namespace/my-service:/home/data.csv . $ kubectl cp ./data.txt my-namespace/my-service:/home/
Specify a container to copy
In some rare cases, you will have several containers running inside one pod, and for that, in order to transfer files to that pod in Kubernetes, what you need to do is to provide that option
-c, --container , which is the container name. If this option is omitted, the first container defined in the spec will be the target destination.
$ kubectl cp my-namespace/my-service:/home/data.csv . -c service $ kubectl cp ./data.txt my-namespace/my-service:/home/ -c service
kubectl cp is very useful and you will need it to transfer files between Kubernetes pods and local system. Some use-cases of this might be when you want to debug some logs or content files output locally inside the container, or you want to get the database dumped of the container…etc.
For any moment that you forget how to use it, issue
kubectl help cp, it will show everything that you need.