Выполните две команды с помощью docker exec
Я пытаюсь выполнить две команды в docker exec. Конкретно, я должен запустить команду внутри определенного каталога. Я пробовал это, но не получилось:
docker exec [id] -c 'cd /var/www/project && composer install'
параметр -c
не обнаружено.
Я также попробовал это:
docker exec [id] cd /var/www/project && composer install
но команда composer install
выполняется после .
Как я могу это сделать?
4 ответов
в вашем первом примере, вы даете -c
флаг 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'"
и, наконец, в этот момент &&
есть перемещен во внутренний набор кавычек, поэтому нам действительно не нужны кавычки вокруг ... можешь бросить их, если хочешь.
docker exec [id] bash -c 'cd /var/www/project && composer install'
все после идентификатора контейнера-это команда для запуска, поэтому в первом примере -c
не является опцией для exec, но докер команды пытается запустить и терпит неудачу, так как эта команда не существует.
скорее всего, вы нашли эту синтаксиса docker run
команда, где entrypoint было установлено в /bin/sh
. Однако exec обходит точку входа, поэтому вам нужно включить полную команду для запуска. Как указывали другие, эта команда включает оболочку, такую как bash или ниже пример, sh:
docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'
Как сказал Нехал Дж Вани в своем комментарии, правильный синтаксис следующий:
docker exec [id] /bin/bash -c 'cd /var/www/project && composer install'
большое спасибо!
другие ответы в порядке, если вы хотите запустить 2 произвольные команды. Но если первая команда просто cd
, то вы должны использовать -w
возможность установить рабочий каталог вместо этого.
docker exec -w {dir} {container} {commands}
так в вашем примере:
docker exec -w /var/www/project {container} composer install