Выполните две команды с помощью 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