Docker打包并部署Next.js

前言

前一段时间公司需要快速开发一个AI项目,所以就不需要后端介入,让我们直接Next.jsORM写出来。这样确实不错,不用对接口,要什么你自己写,大大提升开发效率。

开发好了就需要部署,我就试了试。

跟传统的Web项目有点不一样。传统的 Web 项目在打包部署时,通常会将项目构建(build)生成的静态文件复制到一个 Nginx 容器中。该容器将自身 80 端口映射到宿主机的一个端口,然后宿主机上的 Nginx 实例通过反向代理将外部流量转发到这个宿主机端口,这样用户就可以通过网址来访问了。

Next.js 项目打包后,通常会将 build 阶段生成的 .next 文件夹、public 文件夹以及 package.json 等文件,一起复制到 Node.js 环境的容器中。接着,在容器内执行 npm run start 命令来启动应用。最后,将容器的启动端口(默认是 3000)映射到宿主机的一个端口,并利用宿主机上的 Nginx 实例作为反向代理,将外部流量转发到这个映射的宿主机端口。这样用户就可以通过网址来访问了。

正文

主要的有三个文件 .dockerignoreDockerfiledocker-compose.yml。在跟目录下传教这个三个文件

.dockerignore文件

.dockerignore 复制代码
.git
.gitignore
node_modules
.next
README.md
Dockerfile
.dockerignore

Dockerfile文件

sh 复制代码
FROM node:20-alpine as builder

WORKDIR /app

#复制package.json文件 和 pnpm-lock.yaml文件
COPY package.json pnpm-lock.yaml ./

RUN npm install -g pnpm

RUN npm config set registry https://registry.npmmirror.com/

#安装依赖
RUN --mount=type=cache,target=/root/.pnpm-store pnpm install

#复制项目文件
COPY . .

#构建项目
RUN pnpm run build

FROM node:20-alpine as runner

WORKDIR /app

RUN npm install -g pnpm

RUN npm config set registry https://registry.npmmirror.com/

ENV NODE_ENV=production

# 从builder复制package.json和lock文件
COPY --from=builder /app/package.json /app/pnpm-lock.yaml /app/.env.production /app/.env ./
# 复制 .next 文件夹
COPY --from=builder /app/.next ./.next
# 复制 public 文件夹
COPY --from=builder /app/public ./public
# 只安装生产依赖
RUN --mount=type=cache,target=/root/.pnpm-store pnpm install --prod

EXPOSE 3000

CMD ["pnpm", "start"]

docker-compose.yml文件

yml 复制代码
version: '3.8'

services:
  nextjs-app:
    build: .
    image: docker-next-app
    container_name: nextjs-app
    ports:
      - 3000:3000
    restart: always

最后,配置Nginx

.conf 复制代码
server {
    # 监听 80 端口,等待 HTTP 请求
    listen 80;
    # 你的域名
    server_name xxx.top;

    location / {
        # 将所有请求反向代理到 Next.js 应用
        # 这里的 3000 是你在 Docker Compose 文件中映射的宿主机端口
        proxy_pass http://localhost:3000;

        # 添加一些必要的请求头,以确保 Next.js 应用能正确处理请求
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

当你更新代码需要发版的时,只需要到服务器拉取项目代码,然后运行docker compose up -d --build。你嫌弃麻烦可以写一个脚本,这样只需要运行那个脚本就可以了。还可以用现成的部署工具可以看这篇文章 国产 Dev/Ops 工具 Jpom 的前端项目自动化部署实践,只要点击一下按钮就可以了。

结语

感兴趣的可以去试试

相关推荐
不要em0啦13 分钟前
从0开始学python:简单的练习题3
开发语言·前端·python
老华带你飞13 分钟前
电商系统|基于java + vue电商系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
大猫会长19 分钟前
关于http状态码4xx与5xx的背锅问题
前端
喝拿铁写前端27 分钟前
AI 驱动前端开发覆盖的能力全景拆解
前端·javascript·人工智能
1024小神30 分钟前
确认了,Cloudflare的R2对象存储S3接口api不支持在web端使用
前端
KLW7532 分钟前
vue v-for 列表渲染指令注意
前端·javascript·vue.js
zhengxianyi51538 分钟前
vue 首屏加载优化
前端·javascript·vue.js·nginx·gzip·expires·静态文件缓存
老前端的功夫1 小时前
TypeScript 类型守卫:从编译原理到高级模式
前端·javascript·架构·typescript
未来之窗软件服务1 小时前
幽冥大陆(七十二) 东方仙盟-在线IP归属地自己封装—东方仙盟练气期
前端·javascript·tcp/ip·仙盟创梦ide·东方仙盟·阿雪技术观
QT 小鲜肉1 小时前
【Linux命令大全】001.文件管理之mc命令(实操篇)
linux·运维·服务器·前端·笔记