如何使用 kubectl cp 覆盖目录



我正在使用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>}

这适用于持久卷,因此它将一直存在,直到卷被销毁。

这样做的逻辑是:

  1. 获取所需目录的所有项目
  2. 尝试写入所需目录的所有项目,如果目标目录不存在,则转到第二个语句。
  3. 第二部分,将所需目录写入为目标目录名称
  4. 如果重新运行命令(这会将所需目录放在目标目录中(,则不会再次运行第二部分,而是将所有项目写入目标目录

与其每次都为您的目录执行"kubectl cp",不如使用"卷挂载"将本地目录挂载到您的 pod。

相关内容

  • 没有找到相关文章

最新更新