跳到主要內容

如何在 Docker 中使用 Prisma

10 分鐘

本指南將引導您在 Docker 環境中設定 Prisma ORM 應用程式。您將學習如何配置 Node.js 專案,整合 Prisma 進行資料庫管理,並使用 Docker Compose 編排應用程式。最終,您將擁有一個在 Docker 容器中執行的、功能齊全的 Prisma 應用程式。

先決條件

在開始之前,請確保本地沒有執行任何 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 檔案

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 --save-dev && npm install @prisma/client
npm install express

1.3. 設定 Prisma ORM

現在,初始化 Prisma 以生成必要檔案

npx prisma init --output ../generated/prisma

這將建立

  • 一個 prisma 資料夾,其中包含 schema.prisma,您將在此檔案中定義資料庫 schema。
  • 專案根目錄中的一個 .env 檔案,用於儲存環境變數。

向位於 prisma/schema.prisma 資料夾中的 schema.prisma 檔案新增一個 User 模型

prisma/schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

generator client {
provider = "prisma-client-js"
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 目錄中。

1.4. 建立 Express.js 伺服器

有了 Prisma schema,讓我們建立一個 Express.js 伺服器來與資料庫互動。首先建立一個 index.js 檔案

touch index.js

新增以下程式碼以設定一個基本的 Express 伺服器

index.js
const express = require("express");
const { PrismaClient } = require("./generated/prisma_client");

const app = express();
const prisma = new PrismaClient();
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 指令碼以包含執行伺服器和部署遷移的命令

package.json
"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 檔案

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. 執行資料庫遷移

資料庫執行後,使用以下資料庫連線 URL 更新 .env 檔案

.env
DATABASE_URL="postgresql://postgres:prisma@localhost:5432/postgres?schema=public"

執行遷移以建立資料庫 schema

npx prisma migrate dev --name init

這將在 prisma 資料夾中生成一個 migrations 資料夾。

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 建立的預設網路。
  • 移除關聯的卷(如果未明確命名)。

現在我們已經在本地測試了應用程式,接下來使用 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

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-alpine
  • node:16-alpine
  • node:14-alpine

3.1. 選項 2:使用 Linux Debian (node:slim) 作為基礎映象

node:slim 映象是基於 Linux Debian 的,這是一個穩定且廣泛支援的發行版,它使用 glibc C 標準庫。它在 amd64arm64 上大多開箱即用,如果您遇到 Alpine 的相容性問題或需要更適合生產的環境,這是一個不錯的選擇。但是,此映象的某些舊版本可能未安裝 libssl,因此有時需要手動安裝。

將以下內容新增到 Dockerfile

Dockerfile
FROM node:slim

RUN apt-get update -y \
&& apt-get install -y openssl

WORKDIR /usr/src/app

COPY package.json package-lock.json ./

COPY . .

RUN npm ci

CMD ["sh", "-c", "npm run db:deploy && npm run dev"]

相關 Docker 映象

  • node:lts-slim
  • node:bullseye-slim
  • node:buster-slim
  • node:stretch-slim

3.2. 建立和配置 Docker Compose 檔案

現在 Dockerfile 已準備就緒,我們將使用 Docker Compose 來一起管理應用程式和資料庫。這使得啟動、停止和管理整個設定變得容易。

在您的專案資料夾中建立一個 docker-compose.yml 檔案

touch docker-compose.yml

將以下配置新增到檔案中

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

將以下資料庫連線 URL 新增到 .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 檔案

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 保持聯絡,繼續您的 Prisma 之旅: 我們的活躍社群。保持資訊暢通,參與其中,並與其他開發者協作。

我們真誠地重視您的參與,並期待您成為我們社群的一員!

© . This site is unofficial and not affiliated with Prisma Data, Inc.