Maison  >  Article  >  interface Web  >  Dockerize l'application PERN-TypeScript à l'aide de Prisma ORM avec Docker Compose

Dockerize l'application PERN-TypeScript à l'aide de Prisma ORM avec Docker Compose

Patricia Arquette
Patricia Arquetteoriginal
2024-10-17 06:29:29701parcourir

Dockerize PERN-TypeScript App Using Prisma ORM With Docker Compose

Introduction

Cet article n'entrera pas dans les explications détaillées. Au lieu de cela, je vais simplement fournir les extraits de code dont vous avez besoin pour dockeriser une application de pile PERN. Si vous souhaitez une explication plus détaillée, consultez cet article où j'ai tout couvert plus en profondeur.

La structure du projet

pern-project/
--- frontend/
------ .dockerignore
------ frontend.dockerfile
------ ...
--- backend/
------ .dockerignore
------ backend.dockerfile
------ ...
--- docker-compose.yml

Moteur de code

Créez d'abord une application node.js-express.js :

mkdir backend && cd backend
npm init -y

Installez toutes les dépendances nécessaires depuis npm :

npm install express dotenv cors

Installez également les dépendances de développement liées à Typescript :

npm install --save-dev typescript ts-node @types/express @types/node @types/cors

Générer le fichier tsconfig.json :

tsc --init

Remplacez tout ce qui se trouve dans tsconfig.json par ce morceau de code ci-dessous :

{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "rootDir": "./src",
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*.ts", "data-types.d.ts"]
}

Créez le dossier src et le fichier index.ts dans le dossier src. Alors maintenant, la structure des dossiers backend :

backend/
--- node_modules/
--- src/
------ index.ts
--- package.json
--- tsconfig.json
--- ...

Intégrer Postgres à Prisma

Installez d'abord Prisma et Prisma Client :

npm i @prisma/client
npm i --save-dev prisma

Générer un dossier prisma :

npx prisma init

Écrivez un modèle utilisateur dans le fichier 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")
}

Définissez DATABASE_URL dans le fichier .env :

DATABASE_URL=postgresql://postgres:postgres@db:5432/pern_db?schema=public

Créez un fichier prismadb.ts dans le dossier src :

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

Définissez le point de terminaison /register dans le fichier index.ts. Le fichier 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}`)
})

Fichier Docker back-end

Créez un fichier nommé backend.dockerfile à la racine du répertoire backend et écrivez :

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"]

Pour exclure les node_modules, créez un fichier .dockerignore :

node_modules

Interface de code

Créer le frontend :

npm create vite@latest frontend -- --template react-ts

Faire un appel API dans l'application React :

// 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

Fichier Docker frontal

Créez un fichier nommé frontend.dockerfile à la racine du répertoire frontend et écrivez :

FROM node:20
WORKDIR /app
COPY package*.json .
RUN npm install
EXPOSE 5173
COPY . .
CMD [ "npm", "run", "dev" ]

Fichier Docker-Compose

Ajoutez ce qui suit dans le fichier .env du dossier backend :

// backend/.env

POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=pern_db

DATABASE_URL=postgresql://postgres:postgres@db:5432/pern_db?schema=public

Le fichier 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: {}

Exécutez cette commande :

docker compose up -d

Migrer le schéma prisma :

docker backend -it backend npx prisma migrate dev --name init

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn