我正在使用kubectl cp
命令将本地目录复制到 Kubernetes pod 中
kubectl cp test $POD:/tmp
它将test
目录复制到 Kubernetes pod/tmp
目录中。
现在我想覆盖 pod 中的测试目录。 我没有找到任何选项在使用kubectl cp
命令复制时覆盖目录。
目前,我正在从 pod 中删除测试目录,然后复制该目录。
kubectl exec $POD -- sh -c 'rm -rf /tmp/test'
kubectl cp test $POD:/tmp
这工作正常,但如果复制时出现任何错误,pod 中的现有目录也将被删除。
如何在不先删除 pod 目录的情况下用本地目录覆盖 pod 目录?
提前谢谢。
不幸的是,目前没有办法通过kubectl cp
命令达到您想要的状态。
如果有一些未记录的功能,请随时编辑此答案并提供解决方案,但目前文档中没有一个地方可以建议相反的情况。
无论是在这里还是在上下文帮助中kubectl
命令的帮助,都可以通过运行kubectl cp --help
,没有提到任何选项可以修改kubectl cp
命令的默认操作,该命令基本上是合并已经存在的目录和复制的内容。
$ kubectl cp --help
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, use the kubectl.kubernetes.io/default-container annotation for selecting the
container to be attached or 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
--retries=0:
Set number of retries to complete a copy operation from a container. Specify 0 to disable or any negative
value for infinite retrying. The default is 0 (no retry).
Usage:
kubectl cp <file-spec-src> <file-spec-dest> [options]
Use "kubectl options" for a list of global command-line options (applies to all commands).
基本上kubectl cp
命令的默认行为是合并源目录和目标目录的内容。假设我们有本地目录/tmp/test
包含:
/tmp/test$ ls
different_file.txt
使用单行文本"some content"
.如果我们将本地/tmp/test directory
复制到Pod
上的/tmp
目录,该目录已经包含test
具有不同文件的文件夹,假设testfile.txt
,两个目录的内容将被合并,因此我们的目标/tmp/test
最终将包含:
/tmp/test# ls
different_file.txt testfile.txt
如果我们将本地different_file.txt
的内容更改为"yet another content"
并再次运行以下命令:
kubectl cp /tmp/test pod-name:/tmp
它只会覆盖目标目录中已存在的目标different_file.txt
/tmp/test
。
目前无法覆盖此默认行为。
这是很有可能的。我成功了。在PowerShell中试试这个:
PS> $items = ls <dir1>
PS> foreach ($item in $items) { kubectl cp <dir1>/$item podname:var/opt/mount/<dir2>/$item }
PS> if ($? -eq $false) { kubectl cp <dir1>podname:var/opt/mount/<dir2>}
这适用于持久卷,因此它将一直存在,直到卷被销毁。
这样做的逻辑是:
- 获取所需目录的所有项目
- 尝试写入所需目录的所有项目,如果目标目录不存在,则转到第二个语句。
- 第二部分,将所需目录写入为目标目录名称
- 如果重新运行命令(这会将所需目录放在目标目录中(,则不会再次运行第二部分,而是将所有项目写入目标目录
与其每次都为您的目录执行"kubectl cp",不如使用"卷挂载"将本地目录挂载到您的 pod。