Как я могу использовать конструкции bash, такие как перенаправление cd, && или ››, с помощью ddev exec?

Я пытаюсь делать некоторые сложные вещи с помощью bash в контейнере, используя ddev exec, и, похоже, не могу заставить его работать. Например, ddev exec cd /var/tmp приводит к большому сообщению об ошибке.

Failed to execute command [cd /var/tmp]: Failed to run docker-compose [-f /Users/rfay/workspace/d8git/.ddev/docker-compose.yaml exec -T web cd /var/tmp], err='exit status 126', stdout='OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"cd\": executable file not found in $PATH": unknown

И пытаюсь использовать "||" и «&&» или перенаправление оболочки с помощью «>» тоже не работает.


person rfay    schedule 21.06.2018    source источник


Ответы (1)


Изменить 2019-05-14: Начиная с сегодняшнего выпуска ddev, v1.8.0, ответ ниже устарел, так как перехватчики ddev exec и exec выполняются в контексте bash. Итак, ddev exec "ls | grep php" теперь работает, ddev exec "mysql db <somefile.sql" работает, как и ловушка exec, такая как exec: mysql <somefile.sql

ddev exec (и ловушка "exec" в config.yaml) оба выполняют фактические команды, а не в контексте оболочки. «cd» - это не команда Linux, а скорее встроенная оболочка. И '&&', '||' и '>' или '>>' также являются конструкциями оболочки. Поэтому нам нужно найти обходной путь, чтобы заставить их работать.

Но мы можем использовать bash явно, чтобы заставить эти вещи работать:

ddev exec bash -c "cd /var/tmp && ls > /tmp/junk.txt"

Чтобы сделать то же самое в обработчике post-start в config.yaml:

   hooks:
     post-start:
       - exec: bash -c "cd /var/tmp && ls > /tmp/junk.txt"

Обратите внимание, что переменные среды не будут сохраняться между операторами exec, потому что они находятся в разных оболочках, поэтому лучше всего, если вам нужно сохранить контекст, чтобы сделать это в однострочном формате.

Также обратите внимание, что если вы хотите перенаправить stdout / stderr, вы можете перенаправить либо внутри контейнера (как указано выше), либо на хост (перенаправляя вывод ddev exec) следующим образом:

ddev exec bash -c "cd /var/tmp && ls" >/tmp/junk.txt

Возможно, что ddev exec в будущем может выполнять команды в контексте bash, чтобы сделать это более прозрачным.

person rfay    schedule 21.06.2018