it-roy-ru.com

Выполнить две команды с помощью 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 выполняется после команды docker exec. Как мне это сделать?

13
BraveAdmin

В первом примере вы передаете флаг -c для docker exec. Это простой ответ: у docker exec нет флага -c.

Во втором примере ваш Shell разбирает это на две команды прежде, чем Docker даже увидит это. Это эквивалентно этому:

if docker exec [id] cd /var/www/project
then
    composer install
fi

Сначала запускается docker exec, и если он выходит из 0 (успех), composer install попытается запустить локально вне Docker.

Что вам нужно сделать, это передать обе команды как один аргумент 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'
19
Dan Lowe

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

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

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

как сказал в своем комментарии Нехал Дж. Вани, правильный синтаксис следующий:

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

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

1
BraveAdmin

Другие ответы хороши, если вы хотите запустить 2 произвольные команды. Но если первая команда просто cd, тогда вам следует использовать параметр -w, чтобы установить рабочий каталог.

docker exec -w {dir} {container} {commands}

Итак, в вашем примере:

docker exec -w /var/www/project {container} composer install
0
wisbucky