发表于

使用 Bun 和 Docker 部署独立 Next.js 应用程序的完整指南

作者

为什么用 Bun 和 Docker 部署 Next.js?

当 Bun 达到稳定版本 1,Vercel 开始支持它作为包管理器(尽管运行时仍依赖 Node)时,我感到很 intrigued。你如何在本地模拟 Vercel 部署流程?具体来说,如何用 Bun 和 Docker 部署一个 Next.js 独立应用程序?本指南旨在回答这些问题。

先决条件

  • 对 Docker、Next.js 和 Bun 的基本了解
  • 已安装 Node.js
  • 已安装 Bun 包管理器

分步指南

第 1 步:设置 Dockerfile

以下是您需要的完整 dockerfile

FROM imbios/bun-node:18-slim AS deps
ARG DEBIAN_FRONTEND=noninteractive

# 我使用 Asia/Jakarta 作为时区,您可以将其更改为您的时区
RUN apt-get -y update && \
  apt-get install -yq openssl git ca-certificates tzdata && \
  ln -fs /usr/share/zoneinfo/Asia/Jakarta /etc/localtime && \
  dpkg-reconfigure -f noninteractive tzdata
WORKDIR /app

# 根据首选的包管理器安装依赖项
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile

# 构建应用程序
FROM deps AS builder
WORKDIR /app
COPY . .

RUN bun run build


# 生产镜像,复制所有文件并运行 next
FROM node:18-slim AS runner
WORKDIR /app

ARG CONFIG_FILE
COPY $CONFIG_FILE /app/.env
ENV NODE_ENV production
# 如果你想在运行时禁用遥测,请取消以下行的注释。
# ENV NEXT_TELEMETRY_DISABLED 1

COPY --from=builder  /app/.next/standalone ./

EXPOSE 3001

ENV PORT 3001

CMD ["node", "server.js"]

第 2 步:自定义 Shell 脚本

创建一个自定义 Shell 脚本 ./build.sh

#!/bin/bash
set -e

# 用传递的参数运行 Next.js 构建
next build "$@"

# 如果不在 CI 环境中,只复制文件
if [ -z "$CI" ]; then
  cp -r ./public ./.next/standalone/public
  cp -r ./.next/static ./.next/standalone/.next/static
fi

常见错误和故障排除

在我第一次尝试中遇到了一些问题,尤其是以 node: 为前缀的错误。我通过使用 imbios/bun-node 而不是 oven/bun 作为基础镜像来修复了这些问题。因为我们需要 Node.js 回退来支持 Bun 尚未实现的功能。

总结

通过遵循本指南,您应该能够部署一个 Next.js 应用程序,模拟 Vercel 部署流程,并使用 Bun 和 Docker。请根据您的项目需求随意调整和优化设置。

下一步?

如果您觉得本指南有用,请分享它,如果您有任何问题或改进建议,请留言。敬请期待更多内容!