20.Prisma Migration Container
How to do Prisma migration for production database
ตอนที่เรา dev น่าจะต้องลองทำ migration database บนเครื่องเราก่อน หรือเพื่อความมั่นใจก็อาจจะทำ database migration ที่ UAT server ด้วย ซึ่งมันก็ควรจะเป็นแบบนั้นอยู่แล้วอะนะ
ตอนที่เราสั่ง migration ที่เครื่องของเราเองเราจะใช้คำสั่ง
pnpm prisma:migrate
หรือ
pnpm dlx prisma migrate dev
ต่อมาถ้าทุกอย่างเรียบร้อยดีบนเครื่องเรา ก็ไปทดลองทำ migration ที่เครื่อง UAT ด้วยคำสั่ง
pnpm prisma:migrate:deploy
หรือ
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=22ARG 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 baseWORKDIR /appCOPY package.json pnpm-lock.yaml ./RUN pnpm install --frozen-lockfile
COPY prisma ./prisma/# Run migrationsCMD ["pnpm", "prisma:migrate:deploy"]
สั่ง build แบบนี้
docker build -t hono-migration -f Dockerfile.migration .
Run migration container
เราได้ docker container มาแล้ว
เราจะเอาไปรันได้ยังไงบ้าง
docker command
ถ้ารันด้วย docker
ก็ใช้คำสั่งแบบนี้
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
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 นะ
docker compose up -d postgres && \docker compose --profile migrate up --exit-code-from migrate --remove-orphans -d