Directus 10.10部署Azure无服务器MSSQL启动崩溃问题排查
Directus 10.10 Azure容器部署崩溃问题解决与调试
核心问题分析
你遇到的两个关键问题:
directus_extensions表重复添加id列导致启动崩溃- 空数据库被判定为“已初始化”
这些问题主要源于无服务器MSSQL的冷启动特性、Directus迁移脚本的兼容性,以及容器按需启动带来的重复初始化冲突。
修复与调试步骤
1. 清理异常数据库状态
- 登录Azure无服务器MSSQL,删除已创建的所有Directus系统表(包括
directus_extensions、directus_migrations、directus_settings等),让数据库回到完全空的状态。 - 如果无法全量删除,至少删除
directus_migrations表,这个表记录了迁移执行状态,异常记录会导致Directus重复执行同一迁移。
2. 修正初始化误判问题
- 检查Azure文件存储挂载的
/extensions目录,确保里面没有残留旧的扩展文件或配置。挂载卷中存在的旧扩展可能让Directus误判数据库已完成初始化。 - 确认Directus环境变量
DB_INITIALIZE=true已正确设置,确保空数据库能触发完整初始化流程。
3. 适配无服务器MSSQL配置
添加以下环境变量到Azure容器应用:
DB_MSSQL_ENABLE_CONNECTION_POOLING=false:禁用连接池,避免无服务器DB的会话状态异常干扰迁移。DB_MIGRATIONS_LOCK_TIMEOUT=30000:延长迁移锁超时时间,应对无服务器DB的冷启动延迟。LOG_LEVEL=debug:开启详细日志,便于跟踪迁移执行过程。
4. 优化容器按需启动逻辑
- 将Azure容器应用的最小副本数设为0,最大副本数设为1,避免多实例同时启动触发迁移冲突。
- 修改Directus启动命令为:
sleep 10 && npx directus start,给无服务器MSSQL预留10秒冷启动时间,确保数据库连接稳定后再执行初始化。
5. 调试日志排查
- 查看Azure容器应用的完整日志流,通过
debug级别的日志定位到具体失败的迁移脚本。 - 重点关注
Applying Marketplace...之后的日志,确认是哪个迁移步骤尝试重复添加id列。
SDK查询优化建议
针对容器冷启动的延迟,给SDK查询添加重试逻辑,避免第一次请求失败:
import { createDirectus, rest, readItems } from '@directus/sdk'; const client = createDirectus('http://my-azure-instance.whatever-from-microsoft.com/api').with(rest()); async function getFaqs() { let retries = 3; while (retries > 0) { try { return await client.request( readItems('faqs', { fields: ['id', 'title'] }) ); } catch (error) { retries--; if (retries === 0) throw error; await new Promise(resolve => setTimeout(resolve, 2000)); } } }
内容的提问来源于stack exchange,提问作者Dario
相关产品推荐
相关产品推荐

