Jak uruchomić 2 polecenia za pomocą docker exec

89

Muszę uruchomić 2 polecenia za pomocą docker exec. Kopiuję plik z kontenera Dockera i nie chcę mieć do czynienia z poświadczeniami, aby użyć czegoś takiego jak ssh. To polecenie kopiuje plik:

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

Ale tworzy podkatalog var / log, chcę tego uniknąć, więc gdybym mógł to zrobić w kontenerze docker, powinienem być dobry:

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

Jak sprawić, by docker exec uruchamiał 2 polecenia?

Solx
źródło

Odpowiedzi:

138

To doprowadziło do odpowiedzi: Escape character w wierszu poleceń Dockera Skończyło się na tym:

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

Działa więc, jakby uruchamiając jedno polecenie bash z parametrem, czyli dwoma poleceniami, które chcę uruchomić.

Solx
źródło
Dziękuję bardzo, to mi bardzo pomaga
UnSaid
Jeśli masz podwójne cudzysłowy w poleceniu, możesz to zrobić, -c "cd /var/log; tar -cv \"$1\""jeśli plik ma parametr 1.
zed
28

Dość często potrzeba kilku poleceń, aby zmienić katalog roboczy - jak w pytaniu OP.

W tym celu docker ma teraz -wopcję określenia katalogu roboczego. Np. W niniejszej sprawie

docker exec -w /var/log boring_hawking tar -cv ./file.log
P-Gn
źródło
Naprawdę przydatne, to jest droga.
TortelliEngineer
to jest dokładnie to, czego szukałem!
Clay Mitchell
13

Dla każdego, kto natknie się na to i chce innego sposobu określenia wielu poleceń w celu wykonania bardziej złożonego skryptu:

cat <<EOF | docker exec --interactive boring_hawking sh
cd /var/log
tar -cv ./file.log
EOF
zbrunson
źródło
Jest to bardzo przyjemne, czytelne rozwiązanie, gdy chcesz wykonać bardziej złożony skrypt. Zasługuje na więcej głosów;)
Slava Fomin II
Otrzymuję the input device is not a TTYbłąd z tą metodą
Roy Shilkrot,
--interactiveMa zadbać o to, że jeśli nie jest, to nie jestem pewien, co się dzieje, bez szerszego kontekstu, w jaki używasz tego produktu.
zbrunson
5

Jeśli ktoś przyszedł tutaj po świetną odpowiedź, ale chce również lepszego sposobu rozwiązania pierwotnego problemu OP (OP's OP ..?), Aby skopiować plik z kontenera docker, jest teraz docker cppolecenie, które zrobi to: https: //docs.docker.com/engine/reference/commandline/cp/

Will the Thrill
źródło
miło, naprawdę fajnie
Solx