如何使用 Netty 连接到 docker.sock?
How to connect to docker.sock using Netty?
我有一个使用 Spring WebFlux 的响应式 Spring 启动应用程序。我正在尝试连接到我的 /var/run/docker.sock Unix Domain Socket 以查询一些信息。
从我的终端,我可以使用以下命令获取所有 运行 个容器。
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
嗯,事实证明 Unix 域支持仅在快照 1.0.0-RC2 中可用。配置 spring 以使用 2.4.0-SNAPSHOT 传递地引入支持的 io.projectreactor 模块,该模块具有 Unix 域套接字支持。它现在按预期工作。
我有一个使用 Spring WebFlux 的响应式 Spring 启动应用程序。我正在尝试连接到我的 /var/run/docker.sock Unix Domain Socket 以查询一些信息。
从我的终端,我可以使用以下命令获取所有 运行 个容器。
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
嗯,事实证明 Unix 域支持仅在快照 1.0.0-RC2 中可用。配置 spring 以使用 2.4.0-SNAPSHOT 传递地引入支持的 io.projectreactor 模块,该模块具有 Unix 域套接字支持。它现在按预期工作。