我需要在我的shell脚本中知道一些docker exec命令的输出,例如我有一个nginx容器,并在我的脚本中运行:
docker exec -it containerName /etc/init.d/nginx configtest
我希望仅在nginx配置测试成功时才继续执行脚本,而不是在失败时。
我已经尝试使用$?
,但它是0
,即使然后configtest输出也失败了(因为我理解了docker exec已成功执行)。
答案 0 :(得分:8)
将我的评论翻译成答案。这应该有效:
docker exec -it mynginx /etc/init.d/nginx configtest && echo "pass" || echo "fail"
它对我有用。
答案 1 :(得分:4)
我发现this工作得很好:
docker exec -t -i my-container sh -c 'my-command; exit $?'
答案 2 :(得分:3)
api/client/exec.go#L97-L100
确实获得退出代码:
var status int
if _, status, err = getExecExitCode(cli, execID); err != nil {
return err
}
// getExecExitCode perform an inspect on the exec command. It returns
// the running state and the exit code.
func getExecExitCode(cli *DockerCli, execID string) (bool, int, error) {
resp, err := cli.client.ContainerExecInspect(execID)
if err != nil {
// If we can't connect, then the daemon probably died.
if err != lib.ErrConnectionFailed {
return false, -1, err
}
return false, -1, nil
}
return resp.Running, resp.ExitCode, nil
}
因此,如果您的命令失败,您将获得退出代码
虽然,as mentioned here, you could use nginx -t
instead of configtest
。