如何避免TypeORM在数据库无变更时以代码1退出
解决TypeORM无架构变更时退出导致Docker容器终止的问题
以下是几种实用的解决思路,按推荐程度排序:
1. 用Shell脚本区分"无变更"和真错误(推荐)
TypeORM在未发现架构变更时会返回退出码1,且输出包含未发现数据库架构变更的提示。我们可以写一个shell脚本,仅在真错误(比如数据库连不上、实体语法错误)时返回非0码,无变更时正常退出。
创建migrate-generate.sh脚本:
#!/bin/bash # 执行迁移生成命令并捕获输出 OUTPUT=$(npx typeorm-ts-node-commonjs migration:generate src/migrations/auto -d src/data-source.ts 2>&1) EXIT_CODE=$? # 判断是否是"无变更"场景 if [ $EXIT_CODE -eq 1 ] && echo "$OUTPUT" | grep -q "未发现数据库架构变更"; then echo "未发现架构变更,跳过迁移生成" exit 0 else # 输出原始内容,保留错误信息 echo "$OUTPUT" exit $EXIT_CODE fi
在Dockerfile中添加权限并调用:
COPY migrate-generate.sh /app/ RUN chmod +x /app/migrate-generate.sh CMD ["/app/migrate-generate.sh"]
2. 用TypeORM API自定义检查逻辑
通过TypeORM的编程API提前检测架构差异,只有存在变更时才执行迁移生成命令,从根源避免错误退出。
创建generate-migration.ts:
import { DataSource } from "typeorm"; import { AppDataSource } from "./src/data-source"; // 替换成你的DataSource实例 async function run() { await AppDataSource.initialize(); // 生成架构变更的SQL预览 const schemaDiff = await AppDataSource.driver.createSchemaBuilder().log(); if (schemaDiff.upQueries.length === 0) { console.log("无架构变更,跳过迁移生成"); process.exit(0); } // 存在变更时执行迁移生成 const { execSync } = require('child_process'); execSync( "npx typeorm-ts-node-commonjs migration:generate src/migrations/auto -d src/data-source.ts", { stdio: "inherit" } ); process.exit(0); } run().catch(err => { console.error("迁移生成失败:", err); process.exit(1); });
Docker中执行该脚本:
CMD ["npx", "ts-node", "/app/generate-migration.ts"]
3. 强制忽略退出码(简单但不推荐)
如果不关心错误区分,可以直接在命令后追加|| true,强制容器返回0退出码,但这会掩盖所有错误(比如数据库连接失败),仅适合测试环境:
CMD ["sh", "-c", "npx typeorm-ts-node-commonjs migration:generate src/migrations/auto -d src/data-source.ts || true"]
内容的提问来源于stack exchange,提问作者Code Rains
相关产品推荐
相关产品推荐

