我正在尝试使用容器中的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
Run Code Online (Sandbox Code Playgroud)
并尝试使用"||" 并且"&&"或带有">"的shell重定向也不起作用.
ddev exec(和config.yaml中的"exec"挂钩)都执行实际的comamnds,而不是在shell的上下文中."cd"不是Linux命令,而是内置的shell.'&&','||'和'>'或'>>'也是shell结构.所以我们必须做一些解决方法来使它们工作.
但是我们可以明确地使用bash来使这些东西工作:
ddev exec bash -c "cd /var/tmp && ls > /tmp/junk.txt"
Run Code Online (Sandbox Code Playgroud)
要在config.yaml中的post-start钩子中执行相同的操作:
hooks:
post-start:
- exec: bash -c "cd /var/tmp && ls > /tmp/junk.txt"
Run Code Online (Sandbox Code Playgroud)
请注意,环境变量不会在exec语句之间保留,因为它们位于不同的shell中,因此最好是需要保留上下文以在单行中执行.
另请注意,如果要重定向stdout/stderr,可以在容器内重定向(如上所述)或重定向到主机(重定向ddev exec输出),如下所示:
ddev exec bash -c "cd /var/tmp && ls" >/tmp/junk.txt
Run Code Online (Sandbox Code Playgroud)
这有可能是ddev exec在将来可能会在bash的环境中执行命令,让这个更加透明.
| 归档时间: |
|
| 查看次数: |
723 次 |
| 最近记录: |