Docker Compose部署FastAPI+Keycloak时无法连接Keycloak服务器
FastAPI + Keycloak Docker Compose 连接故障排查
我正在用Docker Compose v2.18.1构建FastAPI + Keycloak应用,运行时FastAPI无法连接Keycloak,报错提示URL格式错误,怀疑是容器间连通性或配置问题。
Docker Compose 配置文件
version: '3.8' services: web: build: ./project/ui_backend command: uvicorn src.main:app --reload --workers 1 --host 0.0.0.0 --port 8000 volumes: - ./project/ui_backend:/usr/src/app ports: - 8004:8000 environment: - DB_HOST=127.0.0.1 - DB_PORT=5432 - DB_PASSWORD=postgres - DB_USER=postgres - DB_NAME=feast_backend_db - FEAST_SERVER_URL=http://127.0.0.1:8009 - POSTGRES_HOST_AUTH_METHOD=trust depends_on: - db - keycloak db: image: postgres:15.3 expose: - 5432 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=feast_backend_db keycloak: image: "quay.io/keycloak/keycloak:latest" command: "start-dev --import-realm" restart: "on-failure" environment: - "KEYCLOAK_ADMIN=admin" - "KEYCLOAK_ADMIN_PASSWORD=admin" volumes: - ./realm-export.json:/opt/keycloak/data/import/myrealm.json ports: - 8080:8080
运行错误日志
File "/usr/local/lib/python3.11/site-packages/keycloak/keycloak_openid.py", line 257, in well_known 47_compose_feast-web-1 | data_raw = self.connection.raw_get(URL_WELL_KNOWN.format(**params_path)) 47_compose_feast-web-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 47_compose_feast-web-1 | File "/usr/local/lib/python3.11/site-packages/keycloak/connection.py", line 247, in raw_get 47_compose_feast-web-1 | raise KeycloakConnectionError("Can't connect to server (%s)" % e) 47_compose_feast-web-1 | keycloak.exceptions.KeycloakConnectionError: Can't connect to server (Invalid URL 'realms/fastapi-realm/.well-known/openid-configuration': No scheme supplied. Perhaps you meant https://realms/fastapi-realm/.well-known/openid-configuration?)
Keycloak 配置代码
from keycloak import KeycloakOpenID # Keycloak configuration KEYCLOAK_SERVER_URL = "localhost:8080" # was trying to replace with keycloak:8080 KEYCLOAK_REALM = "fastapi-realm" KEYCLOAK_CLIENT_ID = "fastapi-client" KEYCLOAK_CLIENT_SECRET ="None" # Use None for public clients ALGORITHM = "RS256" TOKEN_URL = f"{KEYCLOAK_SERVER_URL}/realms/fastapi-realm/protocol/openid-connect/token" # Initialize KeycloakOpenID keycloak_openid = KeycloakOpenID( server_url=f"{KEYCLOAK_SERVER_URL}", client_id=KEYCLOAK_CLIENT_ID, realm_name=KEYCLOAK_REALM, client_secret_key=KEYCLOAK_CLIENT_SECRET, verify=True )
问题根因及修复步骤
- URL缺少协议头:错误提示"No scheme supplied",说明
KEYCLOAK_SERVER_URL没有添加http://前缀,导致拼接后的URL格式无效。 - 容器间网络访问问题:Docker Compose容器内不能用
localhost访问其他服务,必须改用服务名keycloak作为主机名,因为默认网络中服务名会被解析为对应容器的IP。
具体修改:
- 更新Keycloak配置中的服务器地址:
KEYCLOAK_SERVER_URL = "http://keycloak:8080" # 补充http协议,替换localhost为服务名 - 同步修正
TOKEN_URL(会自动使用上面的正确地址):TOKEN_URL = f"{KEYCLOAK_SERVER_URL}/realms/fastapi-realm/protocol/openid-connect/token" - 顺便修正web服务的数据库连接地址(同样不能用localhost):
在Compose文件的web服务环境变量中,把DB_HOST=127.0.0.1改成DB_HOST=db。
额外提示:
depends_on仅保证服务启动顺序,不保证服务完全就绪。如果Keycloak启动较慢,FastAPI可能在Keycloak初始化完成前发起连接,建议在FastAPI中添加重试逻辑,或者给Keycloak配置健康检查,确保服务就绪后再启动web服务。
内容的提问来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

