В вашем первом примере вы указываете флаг на номер docker exec
. Это простой ответ: docker exec
не имеет флага -c
.
В вашем втором примере ваша оболочка анализирует это на две команды, прежде чем Docker даже видит это. Это эквивалентно следующему:
if docker exec [id] cd /var/www/project
then
composer install
fi
Во-первых, docker exec
запускается, и если он выходит из 0 (успех), composer install
будет пытаться запустить локально, вне Докер.
Что вам нужно сделать, это передать обе команды в виде одного аргумента в docker exec
с использованием строки. Тогда они не будут интерпретироваться оболочкой до тех пор, пока она уже находится внутри контейнера.
docker exec [id] "cd /var/www/project && composer install"
Однако, как вы отметили в комментариях, это также не работает. Это потому, что cd
является встроенной оболочкой и не существует сам по себе. Попытка выполнить его как исходная команда не удастся. Итак, следующий шаг - передать это оболочке для выполнения.
docker exec [id] "bash -c 'cd /var/www/project && composer install'"
И, наконец, в этот момент &&
переехал во внутренний набор кавычек, так что мы на самом деле не нужны кавычки вокруг команды bash
... вы можете оставить их, если вы предпочитаете.
docker exec [id] bash -c 'cd /var/www/project && composer install'
ли вы попробовать: 'Докер Exec [ID]/бен/Баш -c«кд/вар/WWW/project && composer install'' –
спасибо, чувак, я не видел вашего комментария, но он сработал! –