2017-02-02 7 views
6

Я пытаюсь выполнить две команды в docker exec. Конкретно, мне нужно запустить команду внутри определенного каталога. Я попробовал это, Butit не получилось:Выполнить две команды с помощью docker exec

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

Параметр -c не обнаружен. Я также попытался это:

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

Но команда composer install выполняется после команды docker exec. Как я могу это сделать?

+1

ли вы попробовать: 'Докер Exec [ID]/бен/Баш -c«кд/вар/WWW/project && composer install'' –

+0

спасибо, чувак, я не видел вашего комментария, но он сработал! –

ответ

12

В вашем первом примере вы указываете флаг на номер 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' 
+0

Привет, я попробовал вашу команду, и она не работает, это ошибка: Ошибка rpc: code = 2 desc = oci Ошибка выполнения: exec failed: container_linux.go: 247: запуск процесса контейнера вызвал «exec: \» cd/var/www/project && composer install \ ": stat cd/var/www/project && composer install: нет такого файла или каталога" Очевидно, что каталог существует, поэтому я могу получить доступ вручную. –

+0

@ Adrià Да, я не думал о том, что 'cd' является командой здесь. Я обновил ответ, хотя теперь он более или менее соответствует ответу, который вы сами разместили (но с более подробным объяснением, почему он работает). –

0

как сказал Nehal J Вани в своем комментарии, правильный синтаксис выглядит следующим образом:

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

большое спасибо!

1

Все, что осталось от идентификатора контейнера, является командой для запуска, поэтому в первом примере -c не является вариантом exec, но команда docker пытается выполнить и сработает, поскольку эта команда не существует.

Скорее всего, вы нашли этот синтаксис из команды docker run, где точка входа была установлена ​​в /bin/sh. Однако exec обходит точку входа, поэтому вам нужно включить полную команду для запуска. Как уже отмечалось, эта команда включает в себя оболочку, как Баш или в приведенном ниже примере, ш:

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