Docker容器间Elasticsearch与Flask应用连接问题求助
解决Flask容器连接Elasticsearch失败及ES数据丢失问题
一、解决每次启动创建新ES实例(数据丢失)的问题
你当前的配置每次启动都会生成全新的Elasticsearch实例,核心原因是没有配置数据持久化——容器销毁后,内部存储的数据会被清空。只需给ES服务添加数据卷挂载,就能保留之前注入的数据:
修改后的docker-compose.yml:
version: '3.8' services: elasticsearch: image: elasticsearch:7.9.2 container_name: intelligent_lovelace environment: discovery.type: single-node ports: - 9200:9200 volumes: # 用Docker命名卷持久化ES数据,也可替换成宿主机路径如 ./es_data:/usr/share/elasticsearch/data - es_data:/usr/share/elasticsearch/data networks: - my_app app: build: context: . dockerfile: Dockerfile depends_on: - elasticsearch ports: - 5000:5000 networks: - my_app networks: my_app: # 声明命名卷 volumes: es_data:
配置完成后,下次启动ES会加载之前注入的数据,不会再创建全新实例。
二、解决Flask容器无法连接ES的问题
1. 修正ES连接地址
容器之间不能用localhost通信,每个容器都有独立的网络命名空间。Flask代码里的ES连接地址必须换成Docker Compose中ES服务的名称elasticsearch:
from elasticsearch import Elasticsearch # 正确写法:用服务名+端口 es = Elasticsearch("http://elasticsearch:9200")
2. 确保ES服务完全就绪
depends_on仅保证ES容器先启动,但不代表ES服务已经初始化完成(ES启动需要加载数据、初始化集群,耗时数秒)。给ES添加健康检查,让Flask等ES就绪后再启动:
# 修改elasticsearch服务配置,添加健康检查 elasticsearch: # ... 其他配置不变 healthcheck: test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep -q '\"status\":\"green\"' || exit 1"] interval: 10s timeout: 10s retries: 5 # 修改app服务的depends_on,依赖ES的健康状态 app: # ... 其他配置不变 depends_on: elasticsearch: condition: service_healthy
3. 确认网络配置
你当前的配置中,两个服务都加入了my_app自定义网络,这部分是正确的——同一自定义网络内的容器默认可以通过服务名直接通信,无需额外配置。
内容的提问来源于stack exchange,提问作者JaisVJ7
相关产品推荐
相关产品推荐

