So führen Sie 2 Befehle mit Docker Exec aus

84

Ich muss 2 Befehle mit Docker Exec ausführen. Ich kopiere eine Datei aus dem Docker-Container und möchte mich nicht mit Anmeldeinformationen befassen müssen, um so etwas wie ssh zu verwenden. Dieser Befehl kopiert eine Datei:

sudo docker exec boring_hawking tar -cv /var/log/file.log | tar -x

Aber es wird ein Unterverzeichnis var / log erstellt. Ich möchte das vermeiden. Wenn ich dies im Docker-Container tun könnte, wäre ich gut:

cd /var/log ; tar -cv ./file.log

Wie kann ich Docker Exec dazu bringen, 2 Befehle auszuführen?

Solx
quelle

Antworten:

136

Dies führte zu der Antwort: Escape-Zeichen in der Docker-Befehlszeile Am Ende tat ich Folgendes:

sudo docker exec boring_hawking bash -c 'cd /var/log ; tar -cv ./file.log' | tar -x

Es funktioniert also sozusagen, indem der Befehl one bash mit einem Parameter ausgeführt wird, der die beiden Befehle sind, die ich ausführen möchte.

Solx
quelle
Vielen Dank, das hilft mir sehr
UnSaid
Wenn Sie doppelte Anführungszeichen innerhalb des Befehls haben, können Sie dies tun, -c "cd /var/log; tar -cv \"$1\""wenn sich die Datei auf Parameter 1 befindet.
zed
27

Sehr oft müssen mehrere Befehle das Arbeitsverzeichnis ändern - wie in der Frage des OP.

Dafür hat Docker jetzt die -wMöglichkeit, das Arbeitsverzeichnis anzugeben. ZB im vorliegenden Fall

docker exec -w /var/log boring_hawking tar -cv ./file.log
P-Gn
quelle
Wirklich nützlich, das ist der richtige Weg.
TortelliEngineer
genau das habe ich gesucht!
Clay Mitchell
11

Für alle anderen, die darüber stolpern und auf andere Weise mehrere Befehle angeben möchten, um ein komplexeres Skript auszuführen:

cat <<EOF | docker exec --interactive boring_hawking sh
cd /var/log
tar -cv ./file.log
EOF
zbrunson
quelle
Dies ist eine sehr gut lesbare Lösung, wenn Sie ein komplexeres Skript ausführen möchten. Es verdient mehr Stimmen;)
Slava Fomin II
Ich the input device is not a TTY
erhalte
Das --interactivesoll sich darum kümmern, wenn das nicht der Fall ist, bin ich mir nicht sicher, was los ist, ohne einen breiteren Kontext darüber zu haben, wie Sie dies verwenden.
Zbrunson
6

Wenn jemand anderes wegen der großartigen Antwort hierher gekommen ist, aber auch eine bessere Möglichkeit zur Lösung des ursprünglichen Problems von OP (OP's OP ..?) Möchte, um eine Datei aus einem Docker-Container zu kopieren, gibt es jetzt einen docker cpBefehl, der dies ausführt : https: //docs.docker.com/engine/reference/commandline/cp/

Wird der Nervenkitzel
quelle
nett, wirklich nett
Solx