Docker Compose配置Hasura双数据库遇Postgres连接错误求助
Hasura分离元数据与业务数据库启动报错问题排查
问题描述
尝试在Docker Compose中为Hasura分离元数据存储库和业务数据存储库,使用的docker-compose.yml配置如下:
version: "3.8" services: meta: image: postgres hostname: meta container_name: meta environment: POSTGRES_DB: meta POSTGRES_USER: meta POSTGRES_PASSWORD: metapass restart: always volumes: - db_meta:/var/lib/postgresql/data networks: - backend data: image: postgres hostname: data container_name: data environment: POSTGRES_DB: data POSTGRES_USER: data POSTGRES_PASSWORD: datapass restart: always volumes: - db_data:/var/lib/postgresql/data networks: - backend graphql-engine: image: hasura/graphql-engine:v2.13.0 ports: - "8080:8080" depends_on: - "meta" - "data" restart: always environment: ## postgres database to store Hasura metadata # Database URL postgresql://username:password@hostname:5432/database HASURA_GRAPHQL_METADATA_DATABASE_URL: meta://meta:metapass@meta:5432/meta ## this env var can be used to add the above postgres database to Hasura as a data source. this can be removed/updated based on your needs PG_DATABASE_URL: data://data:datapass@data:5432/data ## enable the console served by server HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console ## enable debugging mode. It is recommended to disable this in production HASURA_GRAPHQL_DEV_MODE: "true" HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log ## uncomment next line to run console offline (i.e load console assets from server instead of CDN) # HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: /srv/console-assets ## uncomment next line to set an admin secret # HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey networks: - backend volumes: db_data: db_meta: networks: backend: driver: bridge
启动后出现连接错误:
{"detail":{"info":{"code":"postgres-error","error":"connection error","internal":"missing \"=\" after \"meta://meta:metapass@meta:5432/meta\" in connection info string\n","path":"$"},"kind":"catalog_migrate"},"level":"error","timestamp":"2022-10-24T14:16:06.432+0000","type":"startup"}
解决方案
错误根源是数据库连接URL的协议头不符合规范,和主机名无关:
Hasura要求PostgreSQL的连接URL必须以postgresql://(或简写postgres://)开头,你使用的meta://和data://不是合法的PostgreSQL连接协议头,导致解析失败。
1. 修正连接URL
修改Hasura服务的环境变量,替换协议头:
HASURA_GRAPHQL_METADATA_DATABASE_URL: postgresql://meta:metapass@meta:5432/meta PG_DATABASE_URL: postgresql://data:datapass@data:5432/data
2. 优化容器启动依赖(可选但推荐)
默认的depends_on仅保证启动顺序,不确保PostgreSQL服务完全就绪。可以给两个Postgres服务添加健康检查,确保Hasura在数据库就绪后再启动:
给meta服务添加健康检查:
meta: # 原有配置... healthcheck: test: ["CMD-SHELL", "pg_isready -U meta -d meta"] interval: 5s timeout: 5s retries: 5
给data服务添加健康检查:
data: # 原有配置... healthcheck: test: ["CMD-SHELL", "pg_isready -U data -d data"] interval: 5s timeout: 5s retries: 5
修改Hasura的depends_on配置,依赖健康检查状态:
graphql-engine: # 原有配置... depends_on: meta: condition: service_healthy data: condition: service_healthy
3. 确认网络配置
你的配置中三个服务都加入了backend桥接网络,容器间可以通过服务名(meta、data)直接访问,无需额外配置主机名,这部分是正确的。
内容的提问来源于stack exchange,提问作者53845714nF
相关产品推荐
相关产品推荐

