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'
Próbowałaś: 'Döcker exec [id]/bin/bash -c„cd/var/www/project && composer install'' –
dzięki stary, nie widziałem twojego komentarza, ale zadziałało! –