【问题标题】:The result of docker exec commanddocker exec 命令的结果
【发布时间】:2016-03-30 14:31:20
【问题描述】:

我需要在我的 shell 脚本中知道一些 docker exec 命令的输出,例如我有一个 nginx 容器并在我的脚本中运行:

docker exec -it containerName /etc/init.d/nginx configtest

我只想在 nginx 配置测试成功时继续执行脚本,而不是在失败时。

我试过使用$?,但它是0,即使 configtest 输出失败(因为 docker exec 已成功执行,据我了解)。

【问题讨论】:

  • 如果配置文件有任何错误,docker exec -it mynginx /etc/init.d/nginx configtest 会为我返回1
  • @anubhava 你能写下示例脚本吗?我已经试过了:docker exec -it containerName /etc/init.d/nginx configtest ... echo $? ... exit 并得到了以下结果:...Test fail ... 0(注意 0 不是预期的 1)

标签: bash shell docker


【解决方案1】:

api/client/exec.go#L97-L100 确实获得了退出代码:

var status int
if _, status, err = getExecExitCode(cli, execID); err != nil {
    return err
}

来自api/client/utils.go#L84-L97

// 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.

【讨论】:

    【解决方案2】:

    将我的评论翻译成答案。这应该有效:

    docker exec -it mynginx /etc/init.d/nginx configtest && echo "pass" || echo "fail"
    

    它对我有用。

    【讨论】:

      【解决方案3】:

      我发现this 工作得很好:

      docker exec -t -i my-container sh -c 'my-command; exit $?'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-28
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2014-08-08
        • 2023-03-23
        • 2018-11-17
        • 2021-08-22
        相关资源
        最近更新 更多