Соединение отклонено при создании соединения из процесса в док-контейнере с другим процессом в том же контейнере

Я использую инфраструктуру localstack и запускаю ее в контейнере докеров. Я могу подключиться со своего хоста к службе динамо, работающей в контейнере (порт 4569). При попытке подключения из лямбды, работающей в этом контейнере, к динамо (работающему в том же контейнере) в соединении отказывается. IP, который я использую, — это имя контейнера. (например, telnet localstack 4569 не сможет запустить его из лямбды)

Докер PS возвращает:

13:06:33  CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                                                                    NAMES
13:06:33  b909ac695561        localstack/localstack:0.11.4   "docker-entrypoint.sh"   2 minutes ago       Up 2 minutes        4566-4568/tcp, 4593-4597/tcp, 0.0.0.0:4569-4592->4569-4592/tcp, 0.0.0.0:8055->8080/tcp   localstack

сеть докеров проверяет локальную сеть стека, возвращает:

13:06:33  [
13:06:33      {
13:06:33          "Name": "localstack-network",
13:06:33          "Id": "09994610b0d71dfc4fe0147bbc884a749362c3fb42397366591c73e3c10702eb",
13:06:33          "Created": "2020-10-04T10:03:52.586816186Z",
13:06:33          "Scope": "local",
13:06:33          "Driver": "bridge",
13:06:33          "EnableIPv6": false,
13:06:33          "IPAM": {
13:06:33              "Driver": "default",
13:06:33              "Options": null,
13:06:33              "Config": [
13:06:33                  {
13:06:33                      "Subnet": "100.66.0.0/16",
13:06:33                      "Gateway": "100.66.0.1"
13:06:33                  }
13:06:33              ]
13:06:33          },
13:06:33          "Internal": false,
13:06:33          "Attachable": true,
13:06:33          "Ingress": false,
13:06:33          "ConfigFrom": {
13:06:33              "Network": ""
13:06:33          },
13:06:33          "ConfigOnly": false,
13:06:33          "Containers": {
13:06:33              "b909ac695561200c1ab43c70c9f25cd537622593b7eade03d16af89b70c97d76": {
13:06:33                  "Name": "localstack",
13:06:33                  "EndpointID": "783e7aefbef801d7707d46f664b6adf329dceeee6108d23a36c63d5cb3a3fdae",
13:06:33                  "MacAddress": "02:42:64:42:00:02",
13:06:33                  "IPv4Address": "100.66.0.2/16",
13:06:33                  "IPv6Address": ""
13:06:33              }
13:06:33          },
13:06:33          "Options": {},
13:06:33          "Labels": {
13:06:33              "com.docker.compose.network": "localstack-network",
13:06:33              "com.docker.compose.project": "infra",
13:06:33              "com.docker.compose.version": "1.24.1"
13:06:33          }
13:06:33      }
13:06:33  ]

докер-compose.yaml:

  services:
  localstack:
    image: localstack/localstack:0.11.4
    container_name: localstack
    networks:
      - localstack-network
    ports:
      - "4566-4597:4566-4597"
      - '8080:8080'
    environment:
      - SERVICES=lambda,stepfunctions,dynamodb,s3,sns
      - DEBUG=1
      - DATA_DIR=/tmp/localstack/data
      - PORT_WEB_UI=${PORT_WEB_UI- }
      - LAMBDA_EXECUTOR=docker #${LAMBDA_EXECUTOR- docker-reuse}
      - DOCKER_HOST=unix:///var/run/docker.sock
      - LAMBDA_REMOTE_DOCKER=true
      - LAMBDA_REMOVE_CONTAINERS=true
    volumes:
      - "/tmp${TMPDIR:-/tmp/localstack}:/tmp/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"

person Ilan Eden    schedule 04.10.2020    source источник


Ответы (1)


Lambda, которая запускается в локальном стеке, фактически выполняется в контейнере, поэтому у вас есть контейнер (Lambda), работающий в другом контейнере (localstack), поэтому Lambda должен знать адрес локального стека, если ему необходимо взаимодействовать с другими службами локального стека (например, DynamoDB).

Внутри вашей функции Lambda получите адрес localstack и используйте его в объекте конфигурации, который используется для создания экземпляра клиента DynamoDB — это пример C#:

var serviceURL = $@"http://{Environment.GetEnvironmentVariable("LOCALSTACK_HOSTNAME")}:4569";

Могут быть и другие причины, по которым ваша Lambda не может подключиться к локальному стеку, поэтому не стесняйтесь расширить свой вопрос с помощью установочного файла yaml docker/docker-compose и самой функции, я мог бы помочь вам в дальнейшем, если вы все еще застряли.

PS: вы также можете переключиться на один порт 4566 для всех служб локального стека, так как вы используете самую последнюю версию.

person Tomaz Tekavec    schedule 04.10.2020
comment
Спасибо за ответ ±, я также пытался использовать LOCALSTACK_HOSTNAME, и соединение не может быть установлено. Это работает для меня при запуске в локальной среде (Mac OS), но не работает в агенте Jenkins, я добавил файл docker-compose выше - person Ilan Eden; 04.10.2020