スクリプトから呼び出されたPythonクライアントhttps://github.com/elastic/elasticsearch-pyを使用してコンテナー化されたElasticsearchデータベースにインデックスを付けようとしています(コンテナーでも実行されます)。
既存のコードを見るとdocker-compose
、私の目的に使用するのに便利なツールのようです。私のdir構造は
docker-compose.yml
indexer/
- Dockerfile
- indexer.py
- requirements.txt
elasticsearch/
- Dockerfile
私のdocker-compose.yml
読書
version: '3'
services:
elasticsearch:
build: elasticsearch/
ports:
- 9200:9200
networks:
- deploy_network
container_name: elasticsearch
indexer:
build: indexer/
depends_on:
- elasticsearch
networks:
- deploy_network
container_name: indexer
networks:
deploy_network:
driver: bridge
indexer.py
読み取り
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
es = Elasticsearch(hosts=[{"host":'elasticsearch'}]) # what should I put here?
actions = [
{
'_index' : 'test',
'_type' : 'content',
'_id' : str(item['id']),
'_source' : item,
}
for item in [{'id': 1, 'foo': 'bar'}, {'id': 2, 'foo': 'spam'}]
]
# create index
print("Indexing Elasticsearch db... (please hold on)")
bulk(es, actions)
print("...done indexing :-)")
ElasticsearchサービスのDockerfileは
FROM docker.elastic.co/elasticsearch/elasticsearch-oss:6.1.3
EXPOSE 9200
EXPOSE 9300
インデクサーのそれは
FROM python:3.6-slim
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
ENTRYPOINT [ "python" ]
CMD [ "indexer.py" ]
ピップでダウンロードするrequirements.txt
だけで含まelasticsearch
れています。
で実行するとdocker-compose run indexer
、https://pastebin.com/6U8maxGX(ConnectionRefusedError: [Errno 111] Connection refused
)でエラーメッセージが表示されます。elasticsearchはcurl -XGET 'http://localhost:9200/'
、を実行して、または実行することで確認できる範囲で稼働していdocker ps -a
ます。
docker-compose.yml
またはを変更してindexer.py
問題を解決するにはどうすればよいですか?
問題は同期のバグです。接続しようとしたelasticsearch
ときに完全に開始されていませんindexer
。elasticsearch
クエリを実行する前に、再試行ロジックを追加して、それが稼働していることを確認する必要があります。es.ping()
指数バックオフで成功するまでループで実行するようなものでうまくいくはずです。
更新:DockerHEALTHCHECK
命令を使用して、同様の結果を得ることができます(つまり、Docker命令elasticsearch
に対してクエリを実行する前に、Docker命令が稼働していることを確認してください)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加