如何在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
我的问题是:
- 如何在Docker Compose中实现启动SurrealDB并自动导入SurQL文件?
- 执行import命令是否会始终覆盖数据库中已初始化的数据?此前使用PostgreSQL时,可将init.sql放入入口目录,仅在数据库未构建时执行,SurrealDB是否有类似机制?
问题1:实现启动后自动导入SurQL文件的方案
直接用&&串联命令无效,是因为start命令是阻塞式的(SurrealDB启动后会持续运行),导致后续的import命令永远无法执行。下面提供两种可行方案:
方案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
- 给脚本添加执行权限:
chmod +x scripts/start_surrealdb.sh
- 修改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
相关产品推荐
相关产品推荐

