在 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