Как перезаписать каталог с помощью kubectl cp - PullRequest
0 голосов
/ 14 февраля 2020

Я копирую локальный каталог в модуль Kubernetes с помощью команды kubectl cp

kubectl cp test $POD:/tmp

Он копирует каталог test в каталог Kubernetes pod /tmp.

Теперь я хочу переписать тестовый каталог в модуле. Я не нашел никакой возможности перезаписать каталог при копировании с помощью команды kubectl cp.

В настоящее время я удаляю тестовый каталог из модуля и затем копирую каталог.

kubectl exec $POD -- sh -c 'rm -rf /tmp/test'
kubectl cp test $POD:/tmp

Это работает нормально, но в случае возникновения ошибки при копировании существующий каталог из модуля pod также будет удален.

Как перезаписать каталог модуля pod на локальный каталог без сначала удалить каталог pod?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

В настоящее время, к сожалению, нет способа достичь желаемого состояния с помощью команды 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.

  # 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

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 в /tmp в нашем Pod, который уже содержит папку 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.

В настоящее время нет способа изменить это поведение по умолчанию.

0 голосов
/ 14 февраля 2020

Вместо того, чтобы каждый раз выполнять «kubectl cp» для вашего каталога, монтируйте ваш локальный каталог в ваш модуль, используя «Volume Mounts».

...