2017-02-02 24 views
6

Próbuję wykonać dwie komendy w oknie dokowanym exec. Konkretnie, muszę uruchomić polecenie wewnątrz określonego katalogu. Próbowałem to, butit nie działa:Wykonaj dwie komendy za pomocą dokowania exec

docker exec [id] -c 'cd /var/www/project && composer install' 

Parametr -c nie jest wykrywany. Próbowałem to również:

docker exec [id] cd /var/www/project && composer install 

ale polecenie composer install jest wykonywany po poleceniu docker exec. Jak mogę to zrobić?

+1

Próbowałaś: 'Döcker exec [id]/bin/bash -c„cd/var/www/project && composer install'' –

+0

dzięki stary, nie widziałem twojego komentarza, ale zadziałało! –

Odpowiedz

12

W swoim pierwszym przykładzie podajesz flagę -c do docker exec. To łatwa odpowiedź: docker exec nie ma flagi -c.

W twoim drugim przykładzie twoja powłoka analizuje to na dwie komendy, zanim Docker ją zobaczy. Jest to równoznaczne z tym:

if docker exec [id] cd /var/www/project 
then 
    composer install 
fi 

pierwsze, docker exec jest uruchamiany, a jeśli wyjście 0 (sukces), composer install spróbuje uruchomić lokalnie, poza Döcker.

Należy przekazać obydwie komendy jako jeden argument do docker exec za pomocą ciągu znaków. Wtedy nie będą interpretowane przez powłokę, dopóki nie znajdą się wewnątrz pojemnika.

docker exec [id] "cd /var/www/project && composer install" 

Jednak, jak zauważyłeś w komentarzach, to również nie działa. To dlatego, że cd jest wbudowaną powłoką i nie istnieje samodzielnie. Próba wykonania go jako początkowego polecenia zakończy się niepowodzeniem. Następnym krokiem jest przekazanie tego do powłoki, aby wykonać.

docker exec [id] "bash -c 'cd /var/www/project && composer install'" 

I wreszcie, w tym momencie && została przeniesiona do wewnętrznego zestawu cudzysłowie, tak naprawdę nie potrzebują cytaty wokół komendy bash ... można upuścić je, jeśli wolisz.

docker exec [id] bash -c 'cd /var/www/project && composer install' 
+0

Cześć, próbowałem twojego polecenia i to nie działa, to pokazany błąd: Błąd rpc: kod = 2 desc = oci błąd wykonania: exec nie powiodło się: container_linux.go: 247: start procesu kontenera spowodował "exec: \" cd/var/www/project && composer install \ ": stat cd/var/www/project && composer install: brak takiego pliku lub katalogu" oczywiście, katalog istnieje, więc mogę uzyskać dostęp ręcznie. –

+0

@ Adrià Tak, nie myślałem o poleceniu 'cd'. Zaktualizowałem odpowiedź, choć mniej więcej odpowiada teraz odpowiedzi, którą sam napisałeś (ale z większą ilością wyjaśnień, dlaczego to działa). –

0

jak Nehal J Wani powiedział w swoim komentarzu, poprawna składnia jest następująca:

docker exec [id] /bin/bash -c 'cd /var/www/project && composer install' 

wiele dzięki!

1

Wszystko po identyfikatorze kontenera to polecenie do uruchomienia, więc w pierwszym przykładzie -c nie jest opcją do wykonania, ale okno dokowane poleceń próbuje uruchomić się i nie powiedzie się, ponieważ to polecenie nie istnieje.

Najprawdopodobniej znalazłeś tę składnię komendy docker run, w której punkt początkowy został ustawiony na /bin/sh. Jednak exec pomija punkt wejścia, więc musisz podać pełne polecenie do uruchomienia. Jak inni zwrócili uwagę, że polecenie zawiera powłokę bash lub jak w poniższym przykładzie, SH:

docker exec [id] /bin/sh -c 'cd /var/www/project && composer install' 
Powiązane problemy