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

Keycloak容器启动异常、端口缺失及测试报错问题排查求助

问题分析与解决建议

遇到容器启动失败+端口映射找不到的问题,咱们一步步拆解排查:

1. 先定位Keycloak容器启动失败的核心原因

容器退出肯定有明确的日志记录,先执行这条命令查看具体错误:

docker-compose logs keycloak
# 或者直接查看目标容器日志
docker logs performance_keycloak_1

日志会告诉你启动失败的具体诱因——比如数据库连接超时、端口绑定冲突、配置参数错误等,这是排查的核心第一步。

2. 修复docker-compose.yml里的明显配置错误

我注意到Keycloak服务的端口配置有个笔误:

ports:
  - "8080:8080"
  - "9990:990"  # 这里的容器端口写错了!

WildFly/Keycloak的默认管理端口是9990,所以要修正为:

ports:
  - "8080:8080"
  - "9990:9990"

这个错误可能直接导致容器启动时端口绑定失败,进而退出。

3. 完善MariaDB的健康检查配置

你的Keycloak服务依赖MariaDB的service_healthy状态,但当前mariadb服务没有配置健康检查规则,这会让depends_on的条件判断失效——Keycloak可能在MariaDB还没完全就绪时就启动,最终因数据库连接失败退出。

给mariadb服务添加健康检查:

mariadb:
  # 保留原有配置...
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]
    interval: 5s
    timeout: 5s
    retries: 5

这样Docker会自动检测MariaDB是否就绪,只有当数据库完全可用时才启动Keycloak。

4. 优化测试脚本的端口查找逻辑

你的inspectDockerPortMapping函数没有判断容器是否处于运行状态,当容器exited时,NetworkSettings.Ports是nil值,就会触发index of untyped nil错误。可以添加容器运行状态检查:

function inspectDockerPortMapping() {
  local PORT="$1"
  local CONTAINER="$2"
  
  # 先检查容器是否在运行
  local CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' "$CONTAINER")
  if [ "$CONTAINER_STATUS" != "running" ]; then
    echo "Error: Container $CONTAINER is not running (status: $CONTAINER_STATUS)."
    exit 1
  fi

  local INSPECT_COMMAND="docker inspect --format='{{(index (index .NetworkSettings.Ports \"$PORT\") 0).HostPort}}' $CONTAINER"
  MAPPED_PORT="$( eval "$INSPECT_COMMAND" )"
  if [ -z "$MAPPED_PORT" ]; then
    echo "Error finding mapped port for $CONTAINER."
    exit 1
  fi
}

5. 重新启动服务验证

修复完上述配置后,清理旧容器再重新构建启动:

docker-compose down -v
docker-compose up --build -d

用docker-compose ps检查两个容器的状态,确认Keycloak处于up状态后,再运行测试脚本。


内容的提问来源于stack exchange,提问作者Kakashi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:14:06