Docker Compose で Prisma ORM を使用して PERN-TypeScript アプリを Dockerize する

Patricia Arquette
リリース: 2024-10-17 06:29:29
オリジナル
701 人が閲覧しました

Dockerize PERN-TypeScript App Using Prisma ORM With Docker Compose

導入

この記事では詳しい説明は行いません。代わりに、PERN スタック アプリケーションを Docker 化するために必要なコード スニペットのみを提供します。さらに詳細な説明が必要な場合は、すべてをさらに詳しく説明したこの記事を参照してください。

プロジェクトの構造

pern-project/
--- frontend/
------ .dockerignore
------ frontend.dockerfile
------ ...
--- backend/
------ .dockerignore
------ backend.dockerfile
------ ...
--- docker-compose.yml
ログイン後にコピー

コードバックエンド

まず、node.js-express.js アプリを作成します:

mkdir backend && cd backend
npm init -y
ログイン後にコピー

必要な依存関係をすべて npm からインストールします:

npm install express dotenv cors
ログイン後にコピー

Typescript 関連の開発依存関係もインストールします:

npm install --save-dev typescript ts-node @types/express @types/node @types/cors
ログイン後にコピー

tsconfig.json ファイルを生成します:

tsc --init
ログイン後にコピー

tsconfig.json 内のすべてを次のコード部分に置き換えます。

{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "rootDir": "./src",
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*.ts", "data-types.d.ts"]
}
ログイン後にコピー

srcフォルダーとsrcフォルダー内にindex.tsファイルを作成します。これで、バックエンドのフォルダー構造は次のようになります:

backend/
--- node_modules/
--- src/
------ index.ts
--- package.json
--- tsconfig.json
--- ...
ログイン後にコピー

Postgres と Prisma を統合する

最初に Prisma と Prisma クライアントをインストールします:

npm i @prisma/client
npm i --save-dev prisma
ログイン後にコピー

プリズマフォルダーを生成します:

npx prisma init
ログイン後にコピー

schema.prisma ファイルにユーザー モデルを書き込みます:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id        String   @id @default(uuid())
  name      String
  username  String
  email     String
  password  String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@map("users")
}
ログイン後にコピー

.env ファイルに DATABASE_URL を設定します:

DATABASE_URL=postgresql://postgres:postgres@db:5432/pern_db?schema=public
ログイン後にコピー

src フォルダーにファイル prismadb.ts を作成します。

import { PrismaClient } from "@prisma/client"
import "dotenv/config"

// Extend the global object with PrismaClient
declare global {
  var prisma: PrismaClient | undefined
}

// Prevent multiple instances of Prisma Client in development
const prisma = global.prisma || new PrismaClient()

if (process.env.NODE_ENV !== "production") global.prisma = prisma

export default prisma
ログイン後にコピー

index.ts ファイルで /register エンドポイントを定義します。 Index.ts ファイル:

import express, { Request, Response } from "express"
import "dotenv/config"
import cors from "cors"
import { corsOptions } from "./constants/config"

const app = express()
const PORT = process.env.PORT || 3000

app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use(cors({
    const corsOptions = {
    origin: process.env.CLIENT_URL || 'http://localhost:5173',
    credentials: true,
  }
}))

app.get("/", (req: Request, res: Response) => {
  res.json({
    message: "Hello, TypeScript with Express! Updated!",
  })
})

app.post("/register", async (req: Request, res: Response) => {
  const { name, username, email, password } = req.body

  await prisma.user.create({
    data: {
      name,
      username,
      email,
      password,
    },
  })

  res.json({
    message: "User created successfully",
  })
})

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`)
})

ログイン後にコピー

バックエンド Dockerfile

バックエンド ディレクトリのルートに backend.dockerfile という名前のファイルを作成し、次のように記述します。

FROM node:20
WORKDIR /app
COPY package*.json .
RUN npm install
COPY prisma ./prisma
RUN npx prisma generate
COPY . .
EXPOSE 3000
RUN npm install -g nodemon ts-node
CMD ["nodemon", "src/index.ts"]
ログイン後にコピー

node_modules を除外するには、.dockerignore ファイルを作成します。

node_modules
ログイン後にコピー

コードフロントエンド

フロントエンドを作成します:

npm create vite@latest frontend -- --template react-ts
ログイン後にコピー

React アプリで API 呼び出しを行う:

// App.tsx

import { FormEvent, useEffect, useState } from "react"
....

function App() {
  const [name, setName] = useState("")
  const [username, setUsername] = useState("")
  const [email, setEmail] = useState("")
  const [password, setPassword] = useState("")

  const saveUser = async (e: FormEvent) => {
    e.preventDefault()
    await fetch("http://localhost:3000/register", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        name,
        username,
        email,
        password,
      }),
    })
      .then((res) => res.json())
      .then((data) => console.log(data))
  }

  useEffect(() => {
    fetch("http://localhost:3000")
      .then((res) => res.json())
      .then((data) => console.log(data))
  }, [])

  return (
    <>
      <form onSubmit={saveUser}>
        <input
          type="text"
          onChange={(e) => setName(e.target.value)}
          placeholder="Enter your name"
        />
        <input
          type="text"
          onChange={(e) => setUsername(e.target.value)}
          placeholder="Enter your username"
        />
        <input
          type="email"
          onChange={(e) => setEmail(e.target.value)}
          placeholder="Enter your email"
        />
        <input
          type="password"
          onChange={(e) => setPassword(e.target.value)}
          placeholder="Enter your password"
        />
        <button type="submit">Submit</button>
      </form>
    </>
  )
}

export default App
ログイン後にコピー

フロントエンド Dockerfile

フロントエンド ディレクトリのルートに、frontend.dockerfile という名前のファイルを作成し、次のように記述します。

FROM node:20
WORKDIR /app
COPY package*.json .
RUN npm install
EXPOSE 5173
COPY . .
CMD [ "npm", "run", "dev" ]
ログイン後にコピー

Docker-Compose ファイル

バックエンド フォルダーの .env ファイルに以下を追加します:

// backend/.env

POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=pern_db

DATABASE_URL=postgresql://postgres:postgres@db:5432/pern_db?schema=public
ログイン後にコピー

docker-compose.yml ファイル:

services:
  frontend:
    container_name: frontend
    build:
      context: ./frontend
      dockerfile: frontend.dockerfile
    ports:
      - "5173:5173"
    networks:
      - pern_net
    volumes:
      - ./frontend:/app
      - /app/node_modules
    depends_on:
      - server

  backend:
    container_name: backend
    build:
      context: ./backend
      dockerfile: backend.dockerfile
    env_file:
      - ./backend/.env
    ports:
      - "3000:3000"
    networks:
      - pern_net
    volumes:
      - ./backend:/app
      - /app/node_modules
    depends_on:
      - db

  db:
    container_name: db
    image: postgres:14
    restart: always
    ports:
      - "5432:5432"
    networks:
      - pern_net
    env_file:
      - ./backend/.env
    volumes:
      - pgdata:/data/db

networks:
  pern_net:
    driver: bridge

volumes:
  pgdata: {}
ログイン後にコピー

次のコマンドを実行します:

docker compose up -d
ログイン後にコピー

Prisma スキーマを移行します:

docker backend -it backend npx prisma migrate dev --name init
ログイン後にコピー

以上がDocker Compose で Prisma ORM を使用して PERN-TypeScript アプリを Dockerize するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート