DockerでPrismaを使用する方法
このガイドでは、Docker環境内でPrisma ORMアプリケーションをセットアップする手順を説明します。Node.jsプロジェクトの設定、データベース管理のためのPrismaの統合、Docker Composeを使用したアプリケーションのオーケストレーションについて学びます。完了時には、Dockerコンテナ内で完全に機能するPrismaアプリケーションが実行されている状態になります。
前提条件
- Docker および Docker Compose がインストール済みであること
- Node.js バージョン: 互換性のあるNode.jsバージョン。Prisma 6に必要です。
開始する前に、ローカルで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 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 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"
移行を実行してデータベーススキーマを作成します。
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
次のステップでは、ベースイメージとして2つのオプションから選択する必要があります: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標準ライブラリ用にコンパイルされたエンジンをダウンロードします。glibc
をAlpineにインストールしないでください(例:libc6-compat
パッケージ経由)。Prismaが正常に実行されなくなる可能性があります。
関連する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
次のデータベース接続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
これにより、Prisma Studioがhttp://localhost:5555
で、メインアプリがhttp://localhost:3000
でメインアプリと並行して起動します。Prisma Studioを使用して、GUIでデータベースを管理できます。
すべてを起動するには、次のコマンドを実行します。
docker compose -f docker-compose.yml up --build -d
このガイドに従うことで、Docker Composeを使用してPrismaアプリとデータベースを正常にコンテナ化しました。
Prismaとのつながりを保ちましょう
以下とつながることで、Prismaの旅を続けましょう。 活発なコミュニティ。最新情報を入手し、参加し、他の開発者と協力しましょう。
- Xでフォローしてください お知らせ、ライブイベント、役立つヒントをお届けします。
- Discordに参加しましょう 質問をしたり、コミュニティと話し合ったり、会話を通じてアクティブなサポートを受けたりできます。
- YouTubeで購読しましょう チュートリアル、デモ、ストリームをご覧ください。
- GitHubでエンゲージしましょう リポジトリにスターを付けたり、問題を報告したり、issueに貢献したりできます。