Skip to content
CodeSook
CodeSook

20.Prisma Migration Container


How to do Prisma migration for production database

ตอนที่เรา dev น่าจะต้องลองทำ migration database บนเครื่องเราก่อน หรือเพื่อความมั่นใจก็อาจจะทำ database migration ที่ UAT server ด้วย ซึ่งมันก็ควรจะเป็นแบบนั้นอยู่แล้วอะนะ

ตอนที่เราสั่ง migration ที่เครื่องของเราเองเราจะใช้คำสั่ง

prisma migration script
pnpm prisma:migrate

หรือ

prisma migration script
pnpm dlx prisma migrate dev

ต่อมาถ้าทุกอย่างเรียบร้อยดีบนเครื่องเรา ก็ไปทดลองทำ migration ที่เครื่อง UAT ด้วยคำสั่ง

Terminal window
pnpm prisma:migrate:deploy

หรือ

prisma migration script
pnpm dlx prisma migrate deploy

How does migration Container work?

ทีนี้เราจะทำแบบเดียวกันนี้แหละ แต่ว่าใช้ container แทน
หลักการก็คือ เรารัน container เพื่อทำ database migration จากนั้นก็ exit ลบ container ทิ้งได้เลย

Dockerfile for Prisma migration

Dockerfile.migration
ARG NODE_VERSION=22
ARG PNPM_VERSION=9.4.0
FROM node:${NODE_VERSION}-alpine AS base
WORKDIR /usr/src/app
RUN --mount=type=cache,target=/root/.npm \
npm install -g pnpm@${PNPM_VERSION}
FROM base
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
COPY prisma ./prisma/
# Run migrations
CMD ["pnpm", "prisma:migrate:deploy"]

สั่ง build แบบนี้

build migration image
docker build -t hono-migration -f Dockerfile.migration .

Run migration container

เราได้ docker container มาแล้ว
เราจะเอาไปรันได้ยังไงบ้าง

docker command

ถ้ารันด้วย docker ก็ใช้คำสั่งแบบนี้

run migration container
docker run -e DATABASE_URL="postgresql://codesook:[email protected]:5432/hono?schema=public" --rm --name migration hono-migration

docker compose

ถ้าใช้ docker compose ก็จะต้องมี docker compose แบบนี้ก่อน

compose.yaml
compose.yaml
services:
server:
image: hono-day1:latest
environment:
NODE_ENV: production
DATABASE_URL: postgresql://codesook:mysecretpassword@db:5432/hono?schema=public
ports:
- 3000:3000
postgres:
image: postgres
container_name: postgres
restart: always
user: postgres
volumes:
- ./db-data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=hono
- POSTGRES_PASSWORD=mysecretpassword
- POSTGRES_USER=codesook
ports:
- 5432:5432
healthcheck:
test: ["CMD", "pg_isready", -U, <postgres user>]
interval: 10s
timeout: 5s
retries: 5
migrate:
image: hono-migration
container_name: migrate
profiles:
- migrate
environment:
DATABASE_URL: postgresql://codesook:mysecretpassword@db:5432/hono?schema=public
depends_on:
postgres:
condition: service_healthy

เราจะต้อง start database ขึ้นมาก่อน แล้วค่อยสั่ง migrate นะ

running migration container
docker compose up -d postgres && \
docker compose --profile migrate up --exit-code-from migrate --remove-orphans -d