【问题标题】:How to connect to docker.sock using Netty?如何使用 Netty 连接到 docker.sock?
【发布时间】:2020-10-15 14:13:09
【问题描述】:

我有一个使用 Spring WebFlux 的反应式 Springboot 应用程序。我正在尝试连接到我的 /var/run/docker.sock Unix 域套接字以查询一些信息。

从我的终端,我可以使用以下命令获取所有正在运行的容器。

curl --unix-socket /var/run/docker.sock http:/v1.40/containers/json

我正在关注 Project Reactor 指南,found here to create an HttpClient for Unix Domain Sockets

我的测试代码如下。

return client.get()
        .uri("/containers/json")
        .responseContent()
        .asString()
        .collectList()
        .flatMapMany(new Function<List<String>, Publisher<? extends Container>>() {
            @Override
            public Publisher<? extends Container> apply(List<String> strings) {
                return Flux.empty();
            }
        });

HttpClient 是这样创建的。

private HttpClient getOperationsClient(OperationsProperties properties) {
    return HttpClient.create()
            .remoteAddress(() -> new DomainSocketAddress("/var/run/docker.sock"));
}

发出请求时,我收到以下错误。

io.netty.channel.AbstractChannel$AnnotatedConnectException: connect(..) failed: Invalid argument: /var/run/docker.sock

稍微挖掘一下错误,错误来自 io.netty.channel.unix.Socket.java 中的以下行(第 230 行)

res = connectDomainSocket(fd, unixDomainSocketAddress.path().getBytes(CharsetUtil.UTF_8));

res 得到的值是 -22,它转换为堆栈跟踪中的“无效参数”。我已验证我的用户是正确的,并且对 /var/run/docker.sock 具有适当的“rw”权限(我的用户在 docker 组中)。

我做错了什么?

我尝试改变周围的路径。我尝试了unix:///var/run/docker.sock 的套接字地址,结果是Address family not supported by protocol。 我还尝试将 DomainSocket URI 更改为不存在的内容,例如 /var/run/test.sock,这也会导致 -22 Invalid Argument

我添加了 jvm 参数-Djava.net.preferIPv4Stack=true。它仍然不起作用,但似乎原来的 -22 错误已经消失。我现在面对-97 Address family not supported by protocol: /var/run/docker.sock

【问题讨论】:

    标签: java docker unix netty


    【解决方案1】:

    好吧,事实证明 Unix 域支持仅在快照 1.0.0-RC2 中可用。配置 spring 以使用 2.4.0-SNAPSHOT 传递地拉入支持的 io.projectreactor 模块,该模块具有 Unix 域套接字支持。它现在按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多