drizzle-team / drizzle-team/drizzle-orm
drizzle-kit migrate hangs indefinitely in non-TTY environments
- Dominant language
- TypeScript
- Stars
- 35.8k
- Forks
- 1.6k
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 4
Description
## Bug Description
`drizzle-kit migrate` hangs indefinitely when `process.stdout.isTTY` is `false` (Docker entrypoint, CI, piped output). No error is thrown — the process just spins forever on the "applying migrations..." spinner.
## Steps to Reproduce
```bash
# In a Dockerfile ENTRYPOINT or any non-TTY context:
npx drizzle-kit migrate
# Hangs forever at: [⣷] applying migrations...
```
Also reproducible locally by piping output:
```bash
npx drizzle-kit migrate | cat
# Hangs forever
```
## Root Cause
The `renderWithTask` function in drizzle-kit uses hanji's `TaskTerminal` which creates a spinner via `setInterval`. In non-TTY contexts, the terminal render loop appears to block the event loop, preventing the migration promise from resolving.
## Workaround
Call `drizzle-orm/libsql/migrator` directly instead of `drizzle-kit migrate`:
```js
const { createClient } = require('@libsql/client');
const { drizzle } = require('drizzle-orm/libsql');
const { migrate } = require('drizzle-orm/libsql/migrator');
const db = drizzle(createClient({ url: 'file:data/files.db' }));
await migrate(db, { migrationsFolder: './drizzle' });
```
## Environment
- drizzle-kit: 0.31.10
- Node.js: 24.6.0
- OS: Alpine Linux (Docker), Ubuntu 24.04
Contributor guide
Assessment
This issue has not been assessed yet.