Как я могу использовать конструкции 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
И пытается использовать "||" и "&&" или перенаправление оболочки с ">" тоже не работает.
1 ответ
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, чтобы сделать это более прозрачным.