在 Localstack Lambda 和 docker 容器之间发出 http 请求时出现 HttpRequestException
HttpRequestException when making http request between Localstack Lambda and docker container
我有两个 docker 容器 运行 作为 docker-compose 文件的一部分,ContainerA 是本地堆栈,我 运行 是一个 lambda 函数正在尝试使用以下简化代码向 ContainerB 发出 HTTP POST 请求:
var content = new StringContent("{ "content": "sample" }", Encoding.UTF8, "application/json");
var httpClient = new HttpClient();
var response = await HttpClient.PostAsync("http://ContainerB/Foo", content);
引发以下异常:
Request failed - System.Net.Http.HttpRequestException: Name or service not known
如果我从容器 A 的控制台发出相同的请求,则此请求成功,例如
curl http://ContainerB/Foo -H "Content-Type: application/json" -d "{ "content": "sample" }"
由于此请求从控制台成功,我相当确信这不是我的 docker 容器之间的网络问题。
Localstack lambda 是在每次执行时在一个新的 Docker 容器中创建的,这个容器在 docker-compose 堆栈之外,因此它不是 docker-compose 默认网络的一部分。有关详细信息,请参阅 this GitHub 问题。
为了解决这个问题,您必须首先在 docker:
中创建一个外部桥接网络
docker network create -d bridge MyNetwork
然后在您的 docker 组合文件中将每个 docker 容器连接到它,并将其注册为外部网络:
services:
localstack:
networks:
- MyNetwork
...
...
networks:
MyNetwork:
external: true
我有两个 docker 容器 运行 作为 docker-compose 文件的一部分,ContainerA 是本地堆栈,我 运行 是一个 lambda 函数正在尝试使用以下简化代码向 ContainerB 发出 HTTP POST 请求:
var content = new StringContent("{ "content": "sample" }", Encoding.UTF8, "application/json");
var httpClient = new HttpClient();
var response = await HttpClient.PostAsync("http://ContainerB/Foo", content);
引发以下异常:
Request failed - System.Net.Http.HttpRequestException: Name or service not known
如果我从容器 A 的控制台发出相同的请求,则此请求成功,例如
curl http://ContainerB/Foo -H "Content-Type: application/json" -d "{ "content": "sample" }"
由于此请求从控制台成功,我相当确信这不是我的 docker 容器之间的网络问题。
Localstack lambda 是在每次执行时在一个新的 Docker 容器中创建的,这个容器在 docker-compose 堆栈之外,因此它不是 docker-compose 默认网络的一部分。有关详细信息,请参阅 this GitHub 问题。
为了解决这个问题,您必须首先在 docker:
中创建一个外部桥接网络docker network create -d bridge MyNetwork
然后在您的 docker 组合文件中将每个 docker 容器连接到它,并将其注册为外部网络:
services:
localstack:
networks:
- MyNetwork
...
...
networks:
MyNetwork:
external: true