我正在开发一个
FastAPI
项目,该项目使用 Docker Compose 与 OpenSearch
集成。我在尝试连接 OpenSearch 服务时不断遇到 ConnectionRefusedError
。
这是我的设置:
docker-compose.yml:
services:
app:
container_name: app-search
build: .
command: "uvicorn main:app --host 0.0.0.0 --port 8000 --reload"
ports:
- 8001:8000
env_file:
- .env
networks:
- appsearchnet
depends_on:
- db
- opensearch
restart: always
volumes:
- .:/app # Mount the project directory to /app in the container
opensearch:
image: opensearchproject/opensearch:latest
container_name: opensearch
environment:
- plugins.security.disabled=true
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_ADMIN_PASSWORD}
- cluster.name=opensearch-cluster
- node.name=opensearch
- discovery.seed_hosts=opensearch
- cluster.initial_cluster_manager_nodes=opensearch
- bootstrap.memory_lock=true
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- opensearch-data:/usr/share/opensearch/data
ports:
- "9200:9200"
networks:
- appsearchnet
healthcheck:
test: ["CMD-SHELL", "curl -s http://localhost:9200 || exit 1"]
interval: 30s
timeout: 10s
retries: 3
volumes:
opensearch-data:
networks:
appsearchnet:
name: appsearchnet
main.py
from db import opensearch_client
@app.on_event("startup")
def on_startup():
opensearch_client.create_index()
OpenSearch 客户端配置(db/opensearch_client.py):
from dotenv import load_dotenv
from opensearchpy import OpenSearch
load_dotenv()
opensearch_client = OpenSearch(
hosts=[{'host': "opensearch", 'port': 9200}],
http_auth=('admin', 'XXXX'),
http_compress=True,
use_ssl=False,
verify_certs=False,
ssl_assert_hostname=False,
ssl_show_warn=False
)
INDEX_NAME = "books"
def create_index():
if not opensearch_client.indices.exists(INDEX_NAME):
opensearch_client.indices.create(
INDEX_NAME,
body={
"settings": {"number_of_shards": 1},
"mappings": {
"properties": {
"id": {"type": "integer"},
"title": {"type": "text"},
"language": {"type": "keyword"},
"chapters": {
"type": "nested",
"properties": {
"chapter_no": {"type": "integer"},
"title": {"type": "text"},
"content": {"type": "text"},
}
}
}
}
}
)
当我运行安装程序时,我的日志中不断收到以下错误:
2024-10-21 12:51:19,796 - WARNING - HEAD http://opensearch:9200/books [status:N/A request:0.002s]
Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/urllib3/connection.py", line 196, in _new_conn
sock = connection.create_connection(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
raise ConnectionRefusedError: [Errno 111] Connection refused
我已确认 OpenSearch 服务正在运行,但我的 FastAPI 应用程序似乎无法连接。看起来无法访问http://opensearch:9200。
但是我可以在浏览器中调用 http://localhost:9200/ 并打印以下内容:
{
"name" : "opensearch",
"cluster_name" : "opensearch-cluster",
"cluster_uuid" : "kGBFpJNlReiU2qdifiZsFQ",
"version" : {
"distribution" : "opensearch",
"number" : "2.17.1",
"build_type" : "tar",
"build_hash" : "1893d20797e30110e5877170e44d42275ce5951e",
"build_date" : "2024-09-26T21:59:32.078798875Z",
"build_snapshot" : false,
"lucene_version" : "9.11.1",
"minimum_wire_compatibility_version" : "7.10.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "The OpenSearch Project: https://opensearch.org/"
}
什么可能导致此错误,如何修复它?
添加作为后代的答案。
depends_on
单独并不能保证服务将等待数据库健康。要等到运行状况检查成功,您需要在 condition
块中添加 depends_on
:
services:
app:
container_name: app-search
build: .
command: "uvicorn main:app --host 0.0.0.0 --port 8000 --reload"
ports:
- 8001:8000
env_file:
- .env
networks:
- appsearchnet
depends_on:
opensearch:
condition: service_healthy
restart: always
volumes:
- .:/app # Mount the project directory to /app in the container
opensearch:
image: opensearchproject/opensearch:latest
container_name: opensearch
environment:
- plugins.security.disabled=true
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_ADMIN_PASSWORD}
- cluster.name=opensearch-cluster
- node.name=opensearch
- discovery.seed_hosts=opensearch
- cluster.initial_cluster_manager_nodes=opensearch
- bootstrap.memory_lock=true
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- opensearch-data:/usr/share/opensearch/data
ports:
- "9200:9200"
networks:
- appsearchnet
healthcheck:
test: ["CMD-SHELL", "curl -s http://localhost:9200 || exit 1"]
interval: 30s
timeout: 10s
retries: 3
volumes:
opensearch-data:
networks:
appsearchnet:
name: appsearchnet
请参阅此处Docker 文档了解更多信息。