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

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 @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モデルを追加します。

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 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. データベースマイグレーションを実行する

データベースが実行されている状態で、.envファイルを次のデータベース接続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

メッセージを確認するには、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に以下の内容を追加します。

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に以下の内容を追加します。

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

.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

メッセージとともにアプリが実行されていることを確認するには、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

これにより、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で関わる リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりできます。
皆様のご参加を心より歓迎し、コミュニティの一員となっていただけることを楽しみにしております!

© . All rights reserved.