メインコンテンツにスキップ

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 express

1.3. Prisma ORMのセットアップ

次に、Prismaを初期化して、必要なファイルを生成します。

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

これにより、以下が作成されます。

  • データベーススキーマを定義するschema.prismaを含むprismaフォルダー。
  • 環境変数を保存するプロジェクトルートの.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ファイルでは、Prismaが型を生成するカスタムoutputパスを指定します。これにより、Prismaの型が異なるパッケージマネージャー間で正しく解決され、コンテナ内で権限の問題なしにアプリケーションから一貫してアクセスできるようになります。このガイドでは、型は./generated/prisma_clientディレクトリに生成されます。

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");

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スクリプトを更新します。

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フォルダーに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に追加します。

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に基づいています。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

http://localhost: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

これにより、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の旅を続けましょう。 活発なコミュニティ。最新情報を入手し、参加し、他の開発者と協力しましょう。

皆様のご参加を心から歓迎し、コミュニティの一員としてお迎えできることを楽しみにしています!