2

我有 docker 正在运行/var/run/docker.sock

我想附加到一个容器。所以我破解了这个ws库,让它在它的请求中发送 socketPath 和 path 。基本上,它看到ws+unix:///var/run/docker.sock:/containers/theid/attach/ws?args并做正确的事。问题是:docker 在请求中返回 403 禁止。是否刚刚禁用了通过 unix 套接字进行的 websocket 访问?如果我对 websocket 连接发出相同的请求,http://localhost:3000/containers/theid/attach/ws?args则工作正常(我让 docker 守护进程同时监听 http 和 unix 套接字)。

此外,查看 docker 守护进程日志,我看到了预期的 GET 请求

谢谢!

4

1 回答 1

0

内部使用的 websocket 库当前验证请求是否包含Origin具有有效 URL 的标头:

func checkOrigin(config *Config, req *http.Request) (err error) {
    config.Origin, err = Origin(config, req)
    if err == nil && config.Origin == nil {
        return fmt.Errorf("null origin")
    }
    return err
}

(摘自:https ://github.com/golang/net/blob/master/websocket/server.go#L102 )。

如果标头无效或丢失,尽管 Docker 日志未显示任何错误,但您将收到状态 403 响应。

一个简单的解决方案是在您的初始请求中添加一个有效的标头,如下所示:

Origin: http://localhost

于 2015-07-27T20:09:19.653 回答