群晖NAS上Redash+Redis+Postgres容器编排:数据库表缺失问题
relation "queries"不存在的解决方法 问题背景
刚接触容器技术,在群晖NAS用Container Manager完成了Redash、Redis、Postgres的容器编排配置,且验证过Postgres可通过同容器内的adminer正常登录,但运行时scheduler服务持续报错:
ProgrammingError: (psycopg2.ProgrammingError) relation “queries” does not exist
查询得知需要执行docker-compose run --rm server create_db命令创建Redash数据库表,但使用的是群晖Container Manager而非原生Docker,想问是否需要额外挂载卷才能执行该初始化命令?当前的docker-compose.yml配置如下:
version: "3.1" x-redash-service: &redash-service image: redash/redash:latest depends_on: - db - cache restart: always x-redash-env: &redash-env PYTHONUNBUFFERED: 0 REDASH_LOG_LEVEL: "INFO" REDASH_REDIS_URL: "redis://cache:6379/0" REDASH_DATABASE_URL: "postgresql://postgres:postgresPassword@db/postgres" services: redash: <<: *redash-service command: server ports: - "5003:5000" environment: <<: *redash-env REDASH_WEB_WORKERS: 4 adhoc_worker: <<: *redash-service command: worker environment: <<: *redash-env QUEUES: "queries" WORKERS_COUNT: 2 scheduler: <<: *redash-service command: scheduler environment: <<: *redash-env QUEUES: "celery" WORKERS_COUNT: 1 scheduled_worker: <<: *redash-service command: worker environment: <<: *redash-env QUEUES: "scheduled_queries,schemas" WORKERS_COUNT: 1 db: image: postgres:latest restart: always ports: - "5433:5432" volumes: - ./postgres/data:/var/lib/postgresql/data:rw environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgresPassword POSTGRES_DB: postgresDatabase #command: "create_db" nginx: image: redash/nginx:latest ports: - "2501:80" depends_on: - redash restart: always cache: image: redis:latest restart: always depends_on: - db ports: - "6379:6379" volumes: - ./redis/data:/data:rw
解决步骤
1. 先修正数据库连接的致命错误
你的配置里存在一个关键矛盾:Postgres服务的POSTGRES_DB设置为postgresDatabase,但Redash的REDASH_DATABASE_URL指定的数据库是postgres。这会导致Redash连接到错误的数据库,就算执行create_db命令,表也会建在默认的postgres库中,而非你指定的postgresDatabase,自然会出现找不到queries表的错误。
需要把x-redash-env中的数据库URL修改为:
REDASH_DATABASE_URL: "postgresql://postgres:postgresPassword@db/postgresDatabase"
2. 执行初始化命令无需额外挂载卷
群晖Container Manager本质是基于Docker Compose封装的工具,只要你的docker-compose.yml已经正确配置了Redash的环境变量(尤其是数据库连接信息),直接执行初始化命令即可,不需要额外挂载卷。
3. 在群晖中执行初始化命令的两种方式
方式一:通过Container Manager终端操作
- 打开群晖Container Manager,找到你的Redash项目,进入「终端」页面
- 选择
redash服务,在终端窗口直接输入:
或者执行完整命令:create_dbdocker-compose run --rm server create_db
方式二:SSH登录群晖执行命令
- 开启群晖SSH功能,用终端工具(如Windows终端、Putty)登录到群晖
- 切换到
docker-compose.yml所在的目录(比如/volume1/docker/redash) - 执行命令:
docker-compose run --rm server create_db
4. 重启服务验证
执行完初始化命令后,重启所有Redash相关服务(redash、scheduler、adhoc_worker、scheduled_worker),此时scheduler服务就不会再报找不到queries表的错误了。
内容的提问来源于stack exchange,提问作者Daniel Watson

