如何在 Docker 中使用 Prisma
本頁面解答的問題
- 如何執行在 Docker 容器中的 Prisma?
- 如何使用 Prisma 配置 Docker Compose?
- 如何在 Docker 中處理遷移 (Migrations)?
本指南將引導您在 Docker 環境中設置 Prisma ORM 應用程式。您將學習如何配置 Node.js 專案、整合 Prisma 進行資料庫管理,並使用 Docker Compose 編排應用程式。完成後,您將擁有一個在 Docker 容器中完全運行的 Prisma 應用程式。
先決條件
- Docker 與 Docker Compose 已安裝
- Node.js 版本:Prisma 6 所需的相容 Node.js 版本。
Prisma 7.0.0 已更新最低 Node.js 版本要求
- Node.js 20:>= 20.19.0
- Node.js 22:>= 22.12.0
- Node.js 24:>= 24.0.0+
如果您在 Docker 中使用 Prisma 7.0.0 或更高版本,請確保應用程式的 Docker 基礎映像檔(Base Image)使用 Node.js 22 或 24。請將您的 Dockerfile 更新為使用 node:22-alpine 或 node:24-alpine,而非較舊的 Node.js 20 映像檔。
開始之前,請確保本機沒有運行 PostgreSQL 服務,並確認以下連接埠未被佔用,以避免衝突:5432 (PostgreSQL)、3000 (應用程式伺服器) 或 5555 (Prisma Studio 伺服器)。
若要停止現有的 PostgreSQL 服務,請使用
sudo systemctl stop postgresql # Linux
brew services stop postgresql # macOS
net stop postgresql # Windows (Run as Administrator)
若要停止所有正在運行的 Docker 容器並釋放連接埠
docker ps -q | xargs docker stop
1. 設置您的 Node.js 與 Prisma 應用程式
讓我們從建立一個使用 Prisma ORM 和 Express.js 的簡單 Node.js 應用程式開始。
1.1. 初始化您的專案
首先,建立一個新的專案目錄並初始化 Node.js 專案
mkdir docker-test
cd docker-test
npm init -y
這將會產生一個 package.json 檔案
{
"name": "docker-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {},
"keywords": [],
"author": "",
"license": "ISC"
}
1.2. 安裝必要的依賴套件
接下來,將 Prisma CLI 安裝為開發依賴項,並安裝 Express.js 作為伺服器
npm install prisma @types/pg --save-dev
npm install @prisma/client @prisma/adapter-pg pg dotenv express
如果您使用的是不同的資料庫提供者(MySQL、SQL Server、SQLite),請安裝相應的驅動程式適配器套件,而不是 @prisma/adapter-pg。如需更多資訊,請參閱資料庫驅動程式。
1.3. 設置 Prisma ORM
現在,初始化 Prisma 以產生必要的檔案
npx prisma init --output ../generated/prisma
這會建立:
- 一個包含
schema.prisma的prisma資料夾,您將在其中定義資料庫結構。 - 專案根目錄中的一個
.env檔案,用於儲存環境變數。
將 User 模型新增至位於 prisma/schema.prisma 資料夾中的 schema.prisma 檔案
datasource db {
provider = "postgresql"
}
generator client {
provider = "prisma-client"
output = "../generated/prisma_client"
}
model User {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
email String @unique
name String?
}
在 schema.prisma 檔案中,我們指定了一個自定義的 output 路徑,Prisma 將在該路徑中產生其型別。這確保 Prisma 的型別在不同的套件管理器中能正確解析,並且可以在容器內一致地被應用程式存取,而不會出現任何權限問題。在本指南中,型別將產生在 ./generated/prisma_client 目錄中。
現在,在專案根目錄中建立一個 prisma.config.ts 檔案
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config';
export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: env('DATABASE_URL'),
},
});
您需要安裝 dotenv 套件來載入環境變數:
npm install dotenv
1.4. 建立 Express.js 伺服器
準備好 Prisma schema 後,讓我們建立一個 Express.js 伺服器來與資料庫互動。首先建立一個 index.js 檔案
touch index.js
新增以下程式碼以設置基本 Express 伺服器
const express = require("express");
const { PrismaClient } = require("./generated/prisma_client/client");
const { PrismaPg } = require("@prisma/adapter-pg");
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
});
const app = express();
const prisma = new PrismaClient({
adapter,
});
app.use(express.json());
// Get all users
app.get("/", async (req, res) => {
const userCount = await prisma.user.count();
res.json(
userCount == 0
? "No users have been added yet."
: "Some users have been added to the database."
);
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server is running on https://:${PORT}`);
});
更新 package.json 的 scripts,加入用於運行伺服器和部署遷移的指令
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "node index.js",
"db:deploy": "npx prisma migrate deploy && npx prisma generate"
}
現在應用程式已設置完成,讓我們繼續使用 Docker Compose 配置 PostgreSQL 資料庫。
2. 使用 Docker Compose 設置 PostgreSQL 資料庫
為了執行資料庫遷移,我們將使用 Docker Compose 建立一個獨立的 PostgreSQL 資料庫。
2.1. 為 PostgreSQL 建立 Docker Compose 檔案
在根目錄中建立一個 docker-compose.postgres.yml 檔案
version: '3.7'
services:
postgres:
image: postgres:15
restart: always
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=prisma
ports:
- "5432:5432"
networks:
- prisma-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U prisma -d postgres"]
interval: 5s
timeout: 2s
retries: 20
volumes:
- postgres_data:/var/lib/postgresql/data
command: postgres -c listen_addresses='*'
logging:
options:
max-size: "10m"
max-file: "3"
networks:
prisma-network:
volumes:
postgres_data:
2.2. 啟動 PostgreSQL 容器
執行以下指令來啟動資料庫
docker compose -f docker-compose.postgres.yml up -d
2.3. 執行資料庫遷移
在資料庫運行時,使用以下資料庫連接字串更新 .env 檔案
DATABASE_URL="postgresql://postgres:prisma@localhost:5432/postgres?schema=public"
執行遷移以建立資料庫結構
npx prisma migrate dev --name init
接著生成 Prisma Client
npx prisma generate
這應該會在 prisma 資料夾中產生一個 migrations 資料夾,並在 generated/prisma_client 目錄中產生 Prisma Client。
2.4. 測試應用程式
啟動伺服器並驗證其是否正常運作
npm run dev
訪問 https://:3000 查看訊息
No users have been added yet.
停止本機伺服器。
2.5. 清除獨立資料庫
測試完成後,移除獨立的 PostgreSQL 容器
docker compose -f docker-compose.postgres.yml down --remove-orphans
此指令將:
- 停止正在運行的容器。
- 移除容器。
- 移除由 Docker Compose 建立的預設網路。
- 移除相關聯的儲存卷(Volumes,如果沒有明確命名)。
現在我們已經在本機測試過應用程式,接下來讓我們使用 Docker 對其進行容器化。
3. 使用 Docker Compose 同時運行應用程式與資料庫
我們現在將使用 Docker 對應用程式進行容器化,確保它可以在任何環境中運行。
為此,請在專案根目錄中建立一個 Dockerfile
touch Dockerfile
下一步,您需要在兩種基礎映像檔選項之間做出選擇:node:alpine(輕量級)或 node:slim(穩定版)。這兩個選項都得到 Prisma ORM 的完全支援,但配置方式可能有所不同。
3.1. 選項 1:使用 Linux Alpine (node:alpine) 作為基礎映像檔
node:alpine映像檔基於 Alpine Linux,這是一個使用 musl C 標準函式庫的輕量級 Linux 發行版。如果您希望保持容器小巧且高效,這是完美選擇。Prisma 原生支援 amd64 架構上的 Alpine,並自 prisma@4.10.0 起支援 arm64 架構。
將以下內容新增至 Dockerfile
FROM node:lts-alpine3.17
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
CMD ["sh", "-c", "npm run db:deploy && npm run dev"]
在 Linux Alpine 上運行時,Prisma 會下載針對 musl C 標準函式庫編譯的引擎。請不要在 Alpine 上安裝 glibc(例如透過 libc6-compat 套件),因為這會導致 Prisma 無法成功執行。
相關 Docker 映像檔
node:lts-alpinenode:16-alpinenode:14-alpine
3.1. 選項 2:使用 Linux Debian (node:slim) 作為基礎映像檔
node:slim 映像檔基於 Linux Debian,這是一個穩定且廣泛支援的發行版,使用 glibc C 標準函式庫。它在 amd64 和 arm64 架構上通常能直接使用,如果您遇到 Alpine 的相容性問題或需要更適合生產環境的部署,這是很好的選擇。不過,某些舊版本的映像檔可能未預裝 libssl,因此有時需要手動安裝。
將以下內容新增至 Dockerfile
FROM node:slim
RUN apt-get update -y \
&& apt-get install -y openssl
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
CMD ["sh", "-c", "npm run db:deploy && npm run dev"]
相關 Docker 映像檔
node:lts-slimnode:bullseye-slimnode:buster-slimnode:stretch-slim
3.2. 建立並配置 Docker Compose 檔案
現在 Dockerfile 已準備好,我們將使用 Docker Compose 來同時管理應用程式與資料庫。這能簡化整個設定的啟動、停止與管理流程。
在您的專案資料夾中建立一個 docker-compose.yml 檔案
touch docker-compose.yml
將以下配置新增至該檔案
version: '3.7'
services:
postgres_db:
image: postgres:15
hostname: postgres_db
container_name: postgres_db
restart: always
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: prisma
ports:
- '5432:5432'
networks:
- prisma-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
interval: 5s
timeout: 2s
retries: 20
server:
build:
context: .
dockerfile: Dockerfile
ports:
- '3000:3000'
stdin_open: true
tty: true # Keeps the container running for debugging
depends_on:
postgres_db:
condition: service_healthy
env_file:
- .env.prod
networks:
- prisma-network
networks:
prisma-network:
name: prisma-network
3.3. 配置容器的環境變數
在運行應用程式之前,我們需要配置環境變數。建立一個 .env.prod 檔案
touch .env.prod
將以下資料庫連接字串新增至 .env.prod 檔案
DATABASE_URL="postgresql://postgres:prisma@postgres_db:5432/postgres?schema=public"
3.4. 建置並執行應用程式
一切就緒後,現在可以使用 Docker Compose 來建置並運行應用程式。執行以下指令
docker compose -f docker-compose.yml up --build -d
訪問 https://:3000 查看您的應用程式顯示訊息
No users have been added yet.
3.5. 進階:新增 Prisma Studio 進行資料庫管理
Prisma Studio 提供圖形使用者介面 (GUI),讓您能直接在瀏覽器中檢視與管理資料庫。這是在開發過程中進行除錯與資料管理的優秀工具。
若要將 Prisma Studio 新增至您的 Docker 配置中,請更新 docker-compose.yml 檔案
version: '3.7'
services:
postgres_db:
image: postgres:15
hostname: postgres_db
container_name: postgres_db
restart: always
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: prisma
ports:
- '5432:5432'
networks:
- prisma-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
interval: 5s
timeout: 2s
retries: 20
server:
build:
context: .
dockerfile: Dockerfile
ports:
- '3000:3000'
stdin_open: true
tty: true # Keeps the container running for debugging
depends_on:
postgres_db:
condition: service_healthy
env_file:
- .env.prod
networks:
- prisma-network
prisma-studio:
image: node:lts-alpine3.17
working_dir: /usr/src/app
volumes:
- .:/usr/src/app
command: npx prisma studio --port 5555 --browser none
ports:
- "5555:5555"
env_file:
- .env.prod
networks:
- prisma-network
depends_on:
postgres_db:
condition: service_healthy
server:
condition: service_started
networks:
prisma-network:
name: prisma-network
這將會在 https://:5555 啟動 Prisma Studio,與運行在 https://:3000 的主應用程式並存。您可以使用 Prisma Studio 以 GUI 管理資料庫。
執行以下指令來啟動所有項目
docker compose -f docker-compose.yml up --build -d
透過遵循本指南,您已成功使用 Docker Compose 對您的 Prisma 應用程式與資料庫進行了容器化。
與 Prisma 保持聯繫
透過以下方式與我們聯繫,繼續您的 Prisma 旅程: 我們的活躍社群。保持資訊靈通、參與其中,並與其他開發者合作
- 在 X 上關注我們 以獲取公告、現場活動和實用技巧。
- 加入我們的 Discord 提出問題、與社群對話,並透過對話獲得積極支援。
- 在 YouTube 上訂閱 查看教學、演示和直播。
- 在 GitHub 上交流 透過為存放庫加星標、報告問題或為 issue 做出貢獻。