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.

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"

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"
    

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.


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.


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"


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"


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.