Docker Compose中Kong搭配PostgreSQL持续重启问题排查
问题原因分析
你的Kong容器持续重启的核心原因是错误地将一次性数据库初始化命令设为了容器的启动命令:
你在kong服务里配置了command: "kong migrations bootstrap",但kong migrations bootstrap是单次执行的操作——它仅用于初始化Kong的数据库表结构,执行完成后进程就会退出。而你同时设置了restart: always,容器每次退出后都会被Docker自动重启,重启后又重复执行bootstrap命令,此时数据库已经完成初始化,就会输出Database already bootstrapped,进程再次退出,陷入循环。
另外,你保留了KONG_DECLARATIVE_CONFIG环境变量,这是无数据库模式(DB-less)的专属配置项,在使用PostgreSQL时必须移除,否则会引发配置冲突。
修复步骤
1. 停止当前运行的容器
先停止并移除现有容器,终止循环重启:
docker-compose down
2. 修改docker-compose.yaml配置
调整kong服务和数据库服务的配置:
- 移除
kong服务的command: "kong migrations bootstrap",让Kong使用默认启动命令kong start - 移除
kong服务的KONG_DECLARATIVE_CONFIG环境变量 - 给PostgreSQL添加健康检查,确保数据库完全就绪后再启动Kong,避免启动时连接失败
修改后的完整配置如下:
version: '3.8' networks: kong-net: driver: bridge services: kong-database: image: postgres:14 restart: always networks: - kong-net environment: - POSTGRES_USER=kong - POSTGRES_PASSWORD=kong - POSTGRES_DB=kong ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U kong -d kong"] interval: 5s timeout: 5s retries: 5 kong: image: kong:latest container_name: kong restart: always networks: - kong-net environment: - KONG_DATABASE=postgres - KONG_PG_HOST=kong-database - KONG_PG_PORT=5432 - KONG_PG_USER=kong - KONG_PG_PASSWORD=kong - KONG_PG_DATABASE=kong - 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 depends_on: kong-database: condition: service_healthy ports: - "8000:8000" - "8443:8443" - "127.0.0.1:8001:8001" - "127.0.0.1:8444:8444"
3. 启动服务
从日志看,数据库已经成功完成bootstrap,直接启动服务即可:
docker-compose up -d
如果后续需要升级Kong版本,再单独执行迁移命令(如kong migrations up和kong migrations finish),不要将迁移命令设为容器的启动命令。
额外说明
kong migrations bootstrap仅需执行一次,仅在首次初始化数据库时使用,日常启动Kong只需默认的kong start命令。- 数据库模式与无数据库模式(DB-less)不可同时启用,必须移除
KONG_DECLARATIVE_CONFIG配置项。
内容的提问来源于stack exchange,提问作者Sard
相关产品推荐
相关产品推荐

