You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker Compose中启动SurrealDB并导入SurQL文件?

Docker Compose配置SurrealDB启动后自动导入SurQL文件的问题

我正为新项目使用Docker Compose配置SurrealDB,希望执行docker compose up --build时,启动SurrealDB后自动导入指定的SurQL文件,使数据库初始化即带有可用数据。

当前我的SurrealDB容器Docker Compose配置如下:

version: '3'

services:
    surrealdb:
        env_file:
            - .env
        restart: always
        entrypoint: /surreal
        command: start --log trace --user root --pass root file:/data/database.db
        image: surrealdb/surrealdb:latest
        ports:
            - 8000:8000
        volumes:
            - ./data:/data/

我尝试过sh -c、&&串联命令等多种方式添加多命令,但均未达到预期效果:要么SurrealDB无法识别sh等命令,要么第二个导入命令不执行,如下配置仅执行start命令,导入命令无日志、无报错也无数据导入:

command: >
     start --log trace --user root --pass root file://data/database.db &&
     import --conn http://localhost:8000 --user root --pass root --ns test --db test data/database.surql

我的问题是:

  1. 如何在Docker Compose中实现启动SurrealDB并自动导入SurQL文件?
  2. 执行import命令是否会始终覆盖数据库中已初始化的数据?此前使用PostgreSQL时,可将init.sql放入入口目录,仅在数据库未构建时执行,SurrealDB是否有类似机制?

问题1:实现启动后自动导入SurQL文件的方案

直接用&&串联命令无效,是因为start命令是阻塞式的(SurrealDB启动后会持续运行),导致后续的import命令永远无法执行。下面提供两种可行方案:

方案1:自定义启动脚本(灵活适配复杂逻辑)

  1. 在项目目录下创建scripts/start_surrealdb.sh脚本:
#!/bin/sh

# 后台启动SurrealDB
/surreal start --log trace --user root --pass root file:/data/database.db &

# 循环检查服务是否就绪
until curl -s http://localhost:8000/health; do
  echo "等待SurrealDB服务启动..."
  sleep 2
done

# 执行导入操作
/surreal import --conn http://localhost:8000 --user root --pass root --ns test --db test /data/database.surql

# 回到前台运行SurrealDB,避免容器退出
wait
  1. 给脚本添加执行权限:
chmod +x scripts/start_surrealdb.sh
  1. 修改Docker Compose配置,挂载脚本并指定为入口:
version: '3'

services:
    surrealdb:
        env_file:
            - .env
        restart: always
        entrypoint: /scripts/start_surrealdb.sh
        image: surrealdb/surrealdb:latest
        ports:
            - 8000:8000
        volumes:
            - ./data:/data/
            - ./scripts:/scripts/

方案2:使用SurrealDB内置--init参数(简洁推荐)

SurrealDB的start命令支持--init参数,可直接指定初始化用的SurQL文件,启动时自动执行其中的语句,无需额外导入命令。修改Docker Compose的command部分即可:

command: start --log trace --user root --pass root --init /data/database.surql file:/data/database.db

问题2:导入数据的覆盖逻辑与初始化机制

  • import命令的覆盖规则:import的行为完全取决于SurQL文件中的语句:
    • 用CREATE语句:若目标记录已存在(基于ID)会直接报错;
    • 用CREATE OR REPLACE语句:会覆盖已存在的记录;
    • 用INSERT语句:无指定ID时新增记录,指定ID且记录已存在时报错。
  • 类似PostgreSQL的首次初始化机制:SurrealDB目前没有内置的“仅首次启动执行脚本”的目录机制,但可以通过自定义脚本实现:
    在启动脚本中检查数据库是否已初始化(比如查询某个固定表是否存在),仅在首次启动时执行导入。示例脚本片段:
# 检查指定表是否存在,判断是否已初始化
/surreal sql --conn http://localhost:8000 --user root --pass root --ns test --db test -c "SELECT * FROM system_info LIMIT 1;" > /dev/null 2>&1
if [ $? -ne 0 ]; then
  echo "首次初始化,执行数据导入..."
  /surreal import --conn http://localhost:8000 --user root --pass root --ns test --db test /data/database.surql
fi

内容的提问来源于stack exchange,提问作者marvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:58:31