Uruchom okno dokowane <OBRAZ> <WIELU KOMEND>

254

Próbuję uruchomić tak wiele poleceń MULTIPLE.

docker run image cd /path/to/somewhere && python a.py

Ale to daje mi błąd „Brak takiego pliku lub katalogu”, ponieważ jest interpretowany jako ...

"docker run image cd /path/to/somewhere" && "python a.py"

Wygląda na to, że niektóre znaki ESCAPE, takie jak „” lub (), są potrzebne.

Więc też próbowałem

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

ale te nie działały.

Szukałem Docker Run Reference, ale nie znalazłem żadnych wskazówek na temat znaków ESCAPE.

ai0307
źródło

Odpowiedzi:

439

Aby uruchomić wiele poleceń w oknie dokowanym, użyj /bin/bash -ci średnika;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"

W przypadku, gdy będziemy potrzebować polecenia command2 (python), zostanie wykonane, i tylko wtedy, gdy polecenie command1 (cd) zwróci zero (bez błędu) status wyjścia, użyj &&zamiast;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"
anhlc
źródło
Dziękuję za podpowiedź! Po prostu spróbowałem [uruchomić obraz dokera „cd / bin; ls”] i otrzymałem następujące komunikaty o błędach. [exec: "cd / bin; ls": stat cd / bin; ls: brak takiego pliku lub katalogu] [Odpowiedź błędu demona: Nie można uruchomić kontenera]
ai0307
1
Każdy znajdzie, że ta odpowiedź może być zainteresowana sposobem użycia tutaj dokumentów do podania poleceń do kontenera: oto moja odpowiedź na inne podobne pytanie dotyczące dokumentów tutaj, możesz to sprawdzić .
Kohányi Róbert
14
docker run alpine sh -c "ls | wc >> xxx"bardzo mi to pomaga, gdy bash nie jest dostępny.
Eddy Hernandez
1
Działa to, cdale nie w przypadku rzeczy, w których kody powrotne mają znaczenie, ;to nie to samo, co &&patrz unix.stackexchange.com/questions/37069/...
Nick Zalutskiy
1
Dzięki @NickZalutskiy, zaktualizowałem odpowiedź z twoim komentarzem
anhlc
31

Możesz to zrobić na kilka sposobów:

  1. Użyj opcji -w, aby zmienić katalog roboczy:

    -w, --workdir = "" Katalog roboczy w kontenerze

    https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w

  2. Przekaż cały argument do / bin / bash:

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    
John Petrone
źródło
Brak wzmianki o --workdirpodanym linku. Strona prawdopodobnie została przeniesiona / zmieniona. Można zaktualizować do docs.docker.com/engine/reference/run/#workdir lub docs.docker.com/engine/reference/commandline/run
marcv
10

Możesz także potokować polecenia wewnątrz kontenera Docker, bash -c "<command1> | <command2>"na przykład:

docker run img /bin/bash -c "ls -1 | wc -l"

Ale bez wywoływania powłoki w pilocie dane wyjściowe zostaną przekierowane do lokalnego terminala.

USER_1
źródło
3

Jeśli chcesz zapisać wynik w jednym pliku poza kontenerem, na komputerze lokalnym, możesz zrobić coś takiego.

RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c "cat /etc/passwd | grep root > /result.txt"

Rezultat twoich poleceń będzie dostępny /tmp/result.txtna twoim komputerze lokalnym.

Flamarion
źródło
2

Dla każdego, kto tu przyszedł i chce zrobić to samo z docker-composetobą, wystarczy bash -cdołączyć i dołączyć wiele poleceń w cudzysłowie, połączone razem &&.

Tak więc w przykładzie PO docker-compose run image bash -c "cd /path/to/somewhere && python a.py"

S ..
źródło
ten działał dla mnie, ale proces
dokera
i jak wyjść z takiego procesu dokera? naciskanie klawiszy Ctrl C lub Ctrl Z lub pisanie komendy exit nie działa, czy muszę go zabić poleceniem dokowania stop?
node_man
ma docker-compose down [service-name]nie działać lub? (i nie martw się, nie ma za co, chętnie pomożemy :))
S ..
2

Wystarczy odpowiedzieć na komentarz @Eddy Hernandez i jest to bardzo poprawne, ponieważ Alpine ma popioły, a nie bash.

Pytanie dotyczy teraz Uruchamiania powłoki w alpejskim pojemniku Docker, co oznacza użycie shlub ashlub /bin/shlub /bin/ash/.

Na podstawie pytania PO:

docker run image sh -c "cd /path/to/somewhere && python a.py"

Nqsir
źródło
1

bash -cdziała dobrze, jeśli uruchomione polecenia są stosunkowo proste. Jednak jeśli próbujesz uruchomić długą serię poleceń pełną znaków kontrolnych, może się to skomplikować.

Udało mi się to obejść, przesyłając moje polecenia do procesu z zewnątrz, tj

cat script.sh | docker run -i <image> /bin/bash

użytkownik2966041
źródło