drizzle-team / drizzle-team/drizzle-orm

drizzle-kit migrate hangs indefinitely in non-TTY environments

Open
#5,679 1 comment 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.