You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
)

问题根因及修复步骤

  1. URL缺少协议头:错误提示"No scheme supplied",说明KEYCLOAK_SERVER_URL没有添加http://前缀,导致拼接后的URL格式无效。
  2. 容器间网络访问问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:50:17