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アプリケーションをセットアップする
まず、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 --save-dev && npm install @prisma/client
npm install express
1.3. Prisma ORMをセットアップする
次に、必要なファイルを生成するためにPrismaを初期化します。
npx prisma init --output ../generated/prisma
これにより、以下が作成されます。
schema.prisma
を含むprisma
フォルダ。ここにデータベーススキーマを定義します。- プロジェクトルートに
.env
ファイル。ここには環境変数が保存されます。
prisma/schema.prisma
フォルダにあるschema.prisma
ファイルにUser
モデルを追加します。
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
ファイルでは、Prismaが型を生成するカスタムoutput
パスを指定します。これにより、Prismaの型が異なるパッケージマネージャー間で正しく解決され、コンテナ内でアプリケーションから権限の問題なしに一貫してアクセスできるようになります。このガイドでは、型は./generated/prisma_client
ディレクトリに生成されます。
1.4. Express.jsサーバーを作成する
Prismaスキーマが準備できたので、データベースとやり取りするための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 https://:${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. データベースマイグレーションを実行する
データベースが実行されている状態で、.env
ファイルを次のデータベース接続URLで更新します。
DATABASE_URL="postgresql://postgres:prisma@localhost:5432/postgres?schema=public"
データベーススキーマを作成するためにマイグレーションを実行します。
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イメージは、musl
C標準ライブラリを使用する軽量のLinuxディストリビューションであるAlpine 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標準ライブラリ用にコンパイルされたエンジンをダウンロードします。Prismaが正常に実行されなくなるため、Alpineにglibc
(例: libc6-compat
パッケージ経由)をインストールしないでください。
関連するDockerイメージ
node:lts-alpine
node:16-alpine
node:14-alpine
3.1. オプション2: Linux Debian (node:slim
) をベースイメージとして使用する
node:slim
イメージは、glibc
C標準ライブラリを使用する安定した広くサポートされているディストリビューションであるLinux Debianに基づいています。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
.env.prod
ファイルに以下のデータベース接続URLを追加します。
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
これにより、Prisma Studioはhttps://:5555
で、メインアプリはhttps://:3000
で起動します。Prisma Studioを使用してGUIでデータベースを管理できます。
すべてを起動するには、次のコマンドを実行します。
docker compose -f docker-compose.yml up --build -d
このガイドに従うことで、Docker Composeを使用してPrismaアプリとデータベースを正常にコンテナ化できました。
Prismaとつながりましょう
Prismaの旅を続けるには、以下とつながりましょう 活発なコミュニティとつながりましょう。最新情報を入手し、参加し、他の開発者と協力しましょう。
- Xでフォローする アナウンス、ライブイベント、役立つヒントを。
- Discordに参加する 質問したり、コミュニティと話したり、会話を通じて積極的なサポートを受けたりできます。
- YouTubeで購読する チュートリアル、デモ、ストリームを。
- GitHubで関わる リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりできます。