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
相关产品推荐
相关产品推荐

