k8s 容器拷贝文件

有时候我们需要把pod中的文件下载到本地,k8s本身提供了kubectl cp命令。

语法

  1. 复制 files directories containers 和从容器中复制 files directories.
  2. Examples:
  3. # !!!Important Note!!!
  4. # Requires that the 'tar' binary is present in your container
  5. # image. If 'tar' is not present, 'kubectl cp' will fail.
  6. #
  7. # For advanced use cases, such as symlinks, wildcard expansion or
  8. # file mode preservation consider using 'kubectl exec'.
  9. # Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace>
  10. tar cf - /tmp/foo | kubectl exec -i -n <some-namespace> <some-pod> -- tar xf - -C /tmp/bar
  11. # Copy /tmp/foo from a remote pod to /tmp/bar locally
  12. kubectl exec -n <some-namespace> <some-pod> -- tar cf - /tmp/foo | tar xf - -C /tmp/bar
  13. # Copy /tmp/foo_dir local directory to /tmp/bar_dir in a remote pod in the default namespace
  14. kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir
  15. # Copy /tmp/foo local file to /tmp/bar in a remote pod in a specific container
  16. kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>
  17. # Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace>
  18. kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar
  19. # Copy /tmp/foo from a remote pod to /tmp/bar locally
  20. kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar
  21. Options:
  22. -c, --container='': Container name. If omitted, the first container in the pod will be chosen
  23. --no-preserve=false: The copied file/directory's ownership and permissions will not be preserved in the container
  24. Usage:
  25. kubectl cp <file-spec-src> <file-spec-dest> [options]
  26. Use "kubectl options" for a list of global command-line options (applies to all commands).

kubectl cp命令拷贝容器中文件到本地

$ kubectl exec jenkins-builder-zbd4p -n jenkins -- tar cf - /home/jenkins/agent/maven-repositories/0  | sudo tar xf - -C .
Defaulting container name to node.
Use 'kubectl describe pod/jenkins-builder-zbd4p -n jenkins' to see all of the containers in this pod.
tar: Removing leading `/' from member names

[root@iZ0xidn9x6aujoamu80eqnZ test]$ cd home/jenkins/agent/maven-repositories/0/
[root@iZ0xidn9x6aujoamu80eqnZ 0]$ ls
antlr        backport-util-concurrent  cn             commons-collections    commons-io      commons-logging  jakarta    junit  redis     xml-apis
aopalliance  ch                        com            commons-configuration  commons-jxpath  dom4j            javax      net    software  xmlpull
asm          classworlds               commons-codec  commons-fileupload     commons-lang    io               joda-time  org    stax      xpp3

kubectl cp命令拷贝本地文件到容器中

[root@iZ0xidn9x6aujoamu80eqnZ test]$ echo 123 > 1.txt
[root@iZ0xidn9x6aujoamu80eqnZ test]$ kubectl cp /root/test/1.txt jenkins-builder-9vh83:/root -n jenkins
Defaulting container name to node.

#进入容器查看文件
[root@iZ0xidn9x6aujoamu80eqnZ ~]$ kubectl exec -it jenkins-builder-9vh83 -n jenkins /bin/bash
root@jenkins-builder-9vh83:~# cat /root/1.txt
123
root@jenkins-builder-9vh83:~#

扩展:docker 拷贝文件

语法

Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
        docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Copy files/folders between a container and the local filesystem

docker 拷贝容器中文件到本地


root@app:~# docker ps
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                PORTS                                                                  NAMES
22dd5523a639        sonatype/nexus3                      "sh -c ${SONATYPE_DI…"   16 months ago       Up 3 days             0.0.0.0:8081-8082->8081-8082/tcp                                                                  nexus
root@app:~# docker cp 22dd5523a639:/var/log/dnf.log .
root@app:~# ls
dnf.log

docker拷贝本地文件到容器内


root@app:~# echo 123 >123.log
root@app:~# docker cp 123.log 22dd5523a639:/var/log/
root@app:~# docker exec  22dd5523a639 cat /var/log/123.log
123