GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

So kopieren Sie Dateien zwischen Kubernetes-Pods und Ihrem Computer

Container, die in Kubernetes-Pods ausgeführt werden, sind als eigenständige Recheneinheiten gedacht, mit denen Sie nicht manuell interagieren müssen. Manchmal müssen Sie jedoch möglicherweise Dateien in oder aus dem Dateisystem eines Pods kopieren, vielleicht weil Sie ein Problem debuggen und in einem Container gespeicherte Protokolle, Konfigurationsdateien oder Caches archivieren möchten.

So verschieben Sie Dateien zwischen Ihrem Computer und Containern in einem Pod mit der integrierten Übertragungsfunktion von Kubectl oder einer manuellen Alternative.

Kopieren auf oder von Ihrem Gerät

Der kubectl cp Der Befehl ist der einfachste Weg, um in oder aus einem Container-Dateisystem zu kopieren. Es funktioniert ähnlich wie das docker cp Sie sind vielleicht bereits aus der lokalen Containerentwicklung vertraut.

kubectl cp erfordert Quell- und Zielargumente. Eine der Quellen oder Ziele muss eine Pod-Referenz sein. Dies ist als Pod-Name formatiert, gefolgt von einem Doppelpunkt und dem Container-Dateisystempfad.

kubectl cp example-pod:/tmp/example-dir ./example-dir

Dieses Beispiel kopiert den Inhalt von /tmp/example-dir aus example-pod in example-dir auf Ihrem lokalen Dateisystem. Das Umkehren der Argumente würde das example-dir Ihrer Maschine kopieren zurück zum Pod.

Befehlsargumente

Da ein einzelner Pod mehrere Container enthalten kann, ist es wichtig, dies bei der Verwendung von cp zu berücksichtigen . Kubernetes kopiert standardmäßig in die oder aus der ersten Containerinstanz innerhalb des Pods. Sie können stattdessen auf einen bestimmten Container abzielen, indem Sie -c hinzufügen Flagge:

kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container

Wie alle anderen kubectl Befehle, cp läuft gegen die Cluster-Verbindung, die durch Ihre KUBECONFIG definiert ist Umgebungsvariable. Dies ist standardmäßig ~/.kube/conf .

Es gibt zwei Optionen, wenn Sie Namespace-Pods referenzieren. Sie können entweder den Standard --namespace example-namespace hinzufügen kennzeichnen oder verwenden Sie einen vollständigen Pod-Pfad in Ihrer Dateisystemreferenz:

kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir

Dateiattribute werden standardmäßig beibehalten. Fügen Sie --no-preserve hinzu Flag zu Ihrem cp Befehl zum Entfernen von Eigentums- und Berechtigungsdaten aus den kopierten Dateien, die am Ziel verbleiben. Im Gegensatz zum normalen Unix-cp , ist die Implementierung von Kubectl immer rekursiv, sodass der Verweis auf ein Verzeichnis auch dessen Inhalt enthält.

Wenn Kubectl Cp nicht funktioniert

kubectl cp kommt mit einem großen Vorbehalt:intern ist es ein einfacher Wrapper um tar . Der Befehl komprimiert den Quellpfad, kopiert das Archiv zum Ziel und extrahiert dann seinen Inhalt. Ihr Container-Image muss den tar enthalten binär in seinem Pfad, damit dies funktioniert.

Dies bedeutet kubectl cp ist möglicherweise nicht immer eine Option, wenn Sie die Best Practices von Docker befolgen, um Bilder klein zu halten. Obwohl beliebte Minimalbasen wie alpine fügen Sie tar hinzu , es ist möglicherweise nicht in jedem Bild enthalten und wird nicht vorhanden sein, wenn Sie sie von Grund auf neu zusammenstellen.

Die Verwendung von tar schränkt auch ein, was kubectl cp kopieren kann. Sie können keine symbolischen Links auflösen oder Platzhalter wie /tmp/*.log verwenden . Sie müssen einen anderen Ansatz verwenden, wenn diese Funktionalität benötigt wird.

Eine Möglichkeit besteht darin, kubectl exec zu kombinieren , die cat Befehl und Shell-Umleitung, um den Inhalt einer Datei aus dem Cluster in eine lokale Datei zu streamen:

kubectl exec 
    --namespace example-namespace 
    example-pod -c second-container 
    -- cat /tmp/example-file > local-file

Die kubectl exec Der Befehl startet eine Shell-Sitzung im Pod. Alles nach dem -- wird im Container ausgeführt. Die Ausgabe des Aufrufs von cat auf der Datei wird an Ihr Terminal ausgegeben, wo sie in eine lokale Datei umgeleitet werden kann.

Diese Technik eignet sich, wenn Sie eine Handvoll relativ kleiner Dateien kopieren. Es würde schnell mühsam werden, wenn Sie ein großes Verzeichnis abrufen müssten. Leider gibt es keine bessere Alternative, ohne Ihrem Container zusätzliche Software hinzuzufügen.

Wenn Sie sich trauen, können Sie SSH in Ihrem Container installieren und scp verwenden um von Ihrem Host aus auf sein Dateisystem zuzugreifen. Dies würde Ihnen ein vollständiges Kopiererlebnis auf Kosten der Ausführung eines zusätzlichen Daemons und der Schaffung eines potenziellen Sicherheitsproblems bieten. Es sollte nur auf ordnungsgemäß geschützten Clustern in Betracht gezogen werden.

Hinzufügen von tar zu Ihren Container-Images ist eine viel sicherere Option. Dadurch können Sie kubectl cp verwenden und entsperrt erweitertes manuelles Kopieren über kubectl exec wenn Sie zusätzliche Funktionen benötigen. Wenn Sie mit dem cp auf Einschränkungen stoßen Syntax, rufen Sie tar auf direkt über kubectl exec um dem Befehl zusätzliche Flags hinzuzufügen:

kubectl exec 
    --namespace example-namespace 
    example-pod -c second-container 
    -- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir

Dies führt tar -cF aus in Ihrem Container und leitet das Ergebnis an tar xf weiter Extraktionsbefehl auf Ihrem lokalen Computer. Der - weist tar an um die ihm über den Standard-Eingabestrom zugeführten Daten zu extrahieren. -C wird verwendet, um ein Zielverzeichnis anzugeben.

Zusammenfassung

Der kubectl cp Mit dem Befehl können Sie Dateien zwischen Kubernetes-Pods und Ihrem Computer kopieren. Es funktioniert in beide Richtungen, kann aber nicht zum Verschieben von Dateien von Pod zu Pod verwendet werden. Wenn Sie dies tun müssen, verwenden Sie am besten ein zweistufiges Verfahren, indem Sie zuerst von Pod A auf Ihren Computer und dann weiter auf Pod B kopieren.

Als cp stützt sich auf tar Unter der Haube müssen Sie sicherstellen, dass Ihr Container-Image es enthält. Sie sehen ein No such file or directory tar Fehler, wenn Sie versuchen, cp auszuführen gegen einen Pod ohne tar . Fügen Sie in dieser Situation entweder tar hinzu in den Container oder verwenden Sie eine Kombination aus kubectl exec und cat wenn Sie nur ein paar Dateien abrufen müssen.


Docker
  1. So übertragen Sie Dateien zwischen lokalen und Remote-Computern mit dem SFTP-Protokoll

  2. So kopieren Sie Dateien sicher zwischen Linux-Hosts mit SCP und SFTP

  3. Wie kopiere und bearbeite ich Dateien in der Android-Shell?

  4. Suchen und kopieren Sie Dateien

  5. So teilen Sie Dateien zwischen Ubuntu und Mac OS X

So teilen Sie Steam-Spieldateien zwischen Linux und Windows

So verwenden Sie FTP zum Verschieben von Dateien zwischen Ihrem Computer und Ihrem Android-Gerät

So kopieren Sie Dateien und Verzeichnisse im Linux-Terminal

So verwenden Sie Docker Cp zum Kopieren von Dateien zwischen Host und Containern

So kopieren Sie Dateien mit Docker cp in Ihren Docker-Container

So kopieren Sie Dateien zwischen Host und Docker-Container