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.
pern-project/ --- frontend/ ------ .dockerignore ------ frontend.dockerfile ------ ... --- backend/ ------ .dockerignore ------ backend.dockerfile ------ ... --- docker-compose.yml
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 --- ...
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}`) })
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
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
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" ]
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!