使用Docker Compose启动Kong Gateway时出现Lua日志异常问题
Kong Gateway Docker Compose启动异常解决
问题描述
使用Docker Compose启动Kong Gateway容器时,出现以下日志:
[lua] globalpatches.lua:84: sleep(): executing a blocking 'sleep' (0.004 seconds), context: init_worker_by_lua* [lua] globalpatches.lua:84: sleep(): executing a blocking 'sleep' (0.002 seconds), context: init_worker_by_lua* [lua] globalpatches.lua:84: sleep(): executing a blocking 'sleep' (0.016 seconds), context: init_worker_by_lua* [lua] globalpatches.lua:84: sleep(): executing a blocking 'sleep' (0.008 seconds), context: init_worker_by_lua* [lua] warmup.lua:53: warming up DNS entries ..., context: ngx.timer [lua] warmup.lua:87: finished warming up DNS entries' into the cache (in 39ms), context: ngx.timer;
原Docker Compose配置如下(存在语法与配置问题):
services: networks: backend: postgres: .... .... .... kong: image: kong/kong-gateway platform: linux/amd64 environment: - KONG_DATABASE=postgres - KONG_PROXY_ACCESS_LOG=/dev/stdout - KONG_ADMIN_ACCESS_LOG=/dev/stdout - KONG_PROXY_ERROR_LOG=/dev/stderr - KONG_ADMIN_ERROR_LOG=/dev/stderr - KONG_ADMIN_LISTEN="0.0.0.0:8001, 0.0.0.0:8444 ssl" - KONG_PG_HOST=postgres - KONG_PG_USER=postgres - KONG_PG_PASSWORD=postgres - KONG_CASSANDRA_CONTACT_POINTS=postgres ports: - 8000:8000 - 8001:8001 - 8002:8002 - 8443:8443 - 8444:8444 command: - kong - start - --vv restart: no networks: - backend
但直接使用docker run命令启动容器则无异常:
docker run \ -d \ --platform=linux/amd64 \ --name kong \ --network=test_backend \ -e "KONG_DATABASE=postgres" \ -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \ -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \ -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \ -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \ -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \ -e "KONG_PG_HOST=postgres" \ -e "KONG_PG_USER=postgres" \ -e "KONG_PG_PASSWORD=postgres" \ -e "KONG_CASSANDRA_CONTACT_POINTS=postgres" \ -p 8000:8000 \ -p 8001:8001 \ -p 8002:8002 \ -p 8443:8443 \ -p 8444:8444 \ kong/kong-gateway
已知Postgres容器运行正常,已手动创建kong数据库,通过docker run执行Kong迁移(kong bootstrap)也无问题。
解决方案
1. 修正Compose语法错误
原配置中networks被错误嵌套在services节点下,正确写法是networks与services同级。
2. 调整Kong启动命令
原配置指定kong start --vv跳过了镜像默认的初始化流程(含迁移检查),建议要么移除自定义command,使用镜像默认启动逻辑;要么先执行迁移再启动。
3. 修复环境变量引号问题
环境变量中的"是HTML转义字符,替换为普通双引号或直接去掉(值不含空格时)。
4. 移除冗余环境变量
因使用Postgres数据库,KONG_CASSANDRA_CONTACT_POINTS完全多余,直接删除。
修正后的Docker Compose示例
services: postgres: # 保留你的Postgres原有配置,示例如下 image: postgres:15 environment: - POSTGRES_DB=kong - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres networks: - backend volumes: - postgres_data:/var/lib/postgresql/data kong: image: kong/kong-gateway platform: linux/amd64 environment: - KONG_DATABASE=postgres - KONG_PROXY_ACCESS_LOG=/dev/stdout - KONG_ADMIN_ACCESS_LOG=/dev/stdout - KONG_PROXY_ERROR_LOG=/dev/stderr - KONG_ADMIN_ERROR_LOG=/dev/stderr - KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl - KONG_PG_HOST=postgres - KONG_PG_USER=postgres - KONG_PG_PASSWORD=postgres ports: - 8000:8000 - 8001:8001 - 8002:8002 - 8443:8443 - 8444:8444 restart: no networks: - backend # 若需手动控制迁移,可启用以下command # command: sh -c "kong bootstrap && kong start --vv" depends_on: - postgres networks: backend: volumes: postgres_data:
额外说明
- 添加
depends_on确保Kong在Postgres启动后再启动(仅保证启动顺序,生产环境建议添加Postgres健康检查以确保服务就绪) - 若坚持使用
kong start --vv,必须先执行kong bootstrap完成数据库初始化
内容的提问来源于stack exchange,提问作者Mars
相关产品推荐
相关产品推荐

