跳至主要内容

如何在 Docker 中使用 Prisma

10 分钟
本页面回答的问题
  • 如何在 Docker 容器中运行 Prisma?
  • 如何使用 Prisma 配置 Docker Compose?
  • 如何在 Docker 中处理迁移?

本指南将引导您在 Docker 环境中设置 Prisma ORM 应用程序。您将学习如何配置 Node.js 项目、集成 Prisma 进行数据库管理,以及使用 Docker Compose 编排应用程序。学完本指南后,您将拥有一个在 Docker 容器中运行的完全功能的 Prisma 应用程序。

先决条件

警告

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 基础镜像使用 Node.js 22 或 24。将您的 Dockerfile 更新为使用 node:22-alpinenode: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 文件

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.prismaprisma 文件夹,您将在其中定义数据库模式。
  • 项目根目录中的 .env 文件,用于存储环境变量。

prisma/schema.prisma 文件夹中的 schema.prisma 文件中添加一个 User 模型

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 文件

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 模式,让我们创建一个 Express.js 服务器来与数据库交互。首先创建一个 index.js 文件

touch index.js

添加以下代码以设置一个基本的 Express 服务器

index.js
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 脚本,以包含运行服务器和部署迁移的命令

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"

运行迁移以创建数据库模式

npx prisma migrate dev --name init

然后生成 Prisma Client

npx prisma generate

这将在 prisma 文件夹中生成一个 migrations 文件夹,并在 generated/prisma_client 目录中生成 Prisma 客户端。

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,这是一个轻量级的 Linux 发行版,使用 musl C 标准库。如果您希望容器保持小巧高效,它将是完美的选择。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 ./

RUN npm ci

COPY . .

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 之旅: 我们的活跃社区。保持信息灵通,参与其中,并与其他开发人员协作。

我们真诚地感谢你的参与,并期待你成为我们社区的一部分!

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