Использование эластичного поиска внутри Docker: не удалось установить sh новое соединение - PullRequest
0 голосов
/ 22 января 2020

В настоящее время я пытаюсь создать контейнер для приложения, которое включает запись в базу данных с помощью Elasticsearch, но при этом возникают проблемы с подключением. Файл docker-compose.yml в настоящее время выглядит примерно так:

version: "3"
services:
  es:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
    container_name: es
    environment:
      - node.name=es
      - cluster.name=es-docker-cluster
      - cluster.initial_master_nodes=es
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
    volumes:
      - esdata:/usr/share/elasticsearch/data
    networks:
      - dash-network
  dash:
    build: .
    depends_on:
      - es
    ports:
      - 5000:5000
    volumes:
       - .:/usr/src/dash
    networks:
      - dash-network

volumes:
  esdata:
    driver: local

networks:
  dash-network:
    driver: bridge

Мой код Python содержит следующее:

import elasticsearch
es = elasticsearch.Elasticsearch([{'host': 'es', 'port': 9200}])
es.index(index="spam", body={'eggs': 11})

Когда я запускаю docker-compose up, последняя строка в этом сегменте кода появляется следующая ошибка:

esmqtt_1   | elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPConnection object at 0x7f2f60b53dd0>: Failed to establish a new connection: [Errno 111] Connection refused) caused by: NewConnectionError(<urllib3.connection.HTTPConnection object at 0x7f2f60b53dd0>: Failed to establish a new connection: [Errno 111] Connection refused)

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

elliot@elliot-VirtualBox:~/path/to/dash$ sudo docker exec -it dash_dash_1 sh
# python
Python 3.7.6 (default, Jan  3 2020, 23:24:26) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import elasticsearch
>>> es = elasticsearch.Elasticsearch([{'host': 'es', 'port': 9200}])
>>> es.index(index="spam", body={'eggs': 11})
{'_index': 'spam', '_type': '_doc', '_id': '3Ey5zm8B7hzXos4SVZsF', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1}

Я не знаю, почему мой код дает сбой при запуске Dockerfile, но когда я выполняю оболочку, это работает. Почему не удается подключиться в первом экземпляре, но удается в последнем случае? Все советы или советы приветствуются!

1 Ответ

0 голосов
/ 22 января 2020

Он попытался запустить разные контейнеры одновременно, в результате чего контейнер dash попытался подключиться до завершения настройки Elasticsearch. Теперь я использую следующее l oop, чтобы проверить, что оно готово, прежде чем продолжить.

while True:
    try:
        es.search(index="")
        break
    except (
        elasticsearch.exceptions.ConnectionError,
        elasticsearch.exceptions.TransportError
    ):
        time.sleep(1)
...