如何在 Docker 中使用 Prisma
本指南将引导您在 Docker 环境中设置 Prisma ORM 应用程序。您将学习如何配置 Node.js 项目,集成 Prisma 以进行数据库管理,并使用 Docker Compose 编排应用程序。最后,您将拥有一个在 Docker 容器中运行的完整功能的 Prisma 应用程序。
前提条件
- Docker 和 Docker Compose 已安装
- Node.js 版本:与 Prisma 6 兼容的 Node.js 版本。
在开始之前,请确保本地没有 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 应用程序
让我们从创建一个简单的 Node.js 应用程序开始,该应用程序使用 Prisma ORM 和 Express.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 --save-dev
npm install express
1.3. 设置 Prisma ORM
现在,初始化 Prisma 以生成必要的文件
npx prisma init --output ../generated/prisma
这会创建
- 一个
prisma
文件夹,其中包含schema.prisma
,您将在其中定义您的数据库 schema。 - 项目根目录中的一个
.env
文件,用于存储环境变量。
将 User
模型添加到位于 prisma/schema.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 服务器
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 http://localhost:${PORT}`);
});
更新 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
文件
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
文件
DATABASE_URL="postgresql://postgres:prisma@localhost:5432/postgres?schema=public"
运行迁移以创建数据库 schema
npx prisma migrate dev --name init
这应该在 prisma
文件夹中生成一个 migrations
文件夹。
2.4. 测试应用程序
启动服务器并验证它是否工作
npm run dev
访问 http://localhost: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 上的 Alpine。
将以下内容添加到 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 标准库。它在 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 ./
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
将以下配置添加到文件中
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
文件
DATABASE_URL="postgresql://postgres:prisma@postgres_db:5432/postgres?schema=public"
3.4. 构建并运行应用程序
一切都设置好后,是时候使用 Docker Compose 构建并运行应用程序了。运行以下命令
docker compose -f docker-compose.yml up --build -d
访问 http://localhost: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
这将在 http://localhost:5555
启动 Prisma Studio,同时在 http://localhost:3000
启动主应用程序。您可以使用 Prisma Studio 通过 GUI 管理您的数据库。
运行以下命令以启动所有内容
docker compose -f docker-compose.yml up --build -d
通过遵循本指南,您已使用 Docker Compose 成功地容器化了您的 Prisma 应用程序和数据库。
与 Prisma 保持联系
通过与以下社区联系,继续您的 Prisma 之旅 我们的活跃社区。保持信息灵通,积极参与,并与其他开发者协作
- 在 X 上关注我们 获取公告、直播活动和实用技巧。
- 加入我们的 Discord 提出问题,与社区交流,并通过对话获得积极支持。
- 在 YouTube 上订阅 获取教程、演示和直播。
- 在 GitHub 上互动 通过为存储库加星标、报告问题或为问题做出贡献。