我正在尝试使用ddev exec
在容器中使用bash进行一些复杂的操作,但似乎无法使其正常工作。例如,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
并尝试使用“ ||”并且“ &&”或带有“>”的shell重定向也不起作用。
答案 0 :(得分:5)
编辑2019-05-14:截至今天的ddev版本v1.8.0,以下答案已过时,因为ddev exec
和exec挂钩在bash上下文中执行。因此ddev exec "ls | grep php"
现在有效,ddev exec "mysql db <somefile.sql"
有效,像exec: mysql <somefile.sql
ddev exec(以及config.yaml中的“ exec”钩子)都执行实际命令,而不是在shell上下文中。 “ cd”不是Linux命令,而是内置的shell。而且,“ &&”,“ ||”,“>”或“ >>”也是shell构造。因此,我们必须做一些变通方法以使其正常工作。
但是我们可以显式地使用bash来使这些事情起作用:
ddev exec bash -c "cd /var/tmp && ls > /tmp/junk.txt"
要在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上下文中执行命令以使其更加透明。