日拱一卒无有尽,功不唐捐终入海

Next.js项目的Dockerfile

我目前使用Docker进行Next.js项目的部署。构建Docker镜像需要先创建Dockerfile文件。

    什么是Dockerfile?

    Dockerfile 是一个文本文件,它包含了一系列的指令和参数,用于定义如何构建一个 Docker 镜像。每个指令创建镜像中的一层,并且每一层都是只读的。当你构建镜像时,Docker 会按照 Dockerfile 中的指令顺序执行,并逐层应用这些指令。

    Dockerfile 的常见指令包括:

    1. FROM:指定基础镜像,这是构建新镜像的起点。
    2. RUN:执行命令并创建一个新层,用于安装软件包或执行其他命令。
    3. CMD:提供默认的容器启动命令。
    4. ENTRYPOINT:设置容器启动时执行的命令,可以与 CMD 指令结合使用。
    5. COPY 和 ADD:将文件从构建上下文复制到镜像中。
    6. ENV:设置环境变量。
    7. WORKDIR:设置工作目录。
    8. USER:设置运行容器时的用户。
    9. EXPOSE:声明容器运行时监听的端口。
    10. VOLUME:创建挂载点,用于持久化或共享数据。
    11. ARG:定义构建参数,可以在构建时传递给 Dockerfile
    FROM node:22-alpine AS base
    
    # Next.js collects completely anonymous telemetry data about general usage.
    # Learn more here: https://nextjs.org/telemetry
    ENV NEXT_TELEMETRY_DISABLED 1
    
    # Set the working directory
    WORKDIR /app
    
    # Copy package.json and package-lock.json
    COPY package*.json ./
    
    # Install dependencies
    RUN npm install
    
    # Copy the rest of the application code
    COPY . .
    
    # Build the Next.js application
    RUN npm run build
    
    # Expose the port that the app runs on
    EXPOSE 3000
    
    # Start the Next.js application
    CMD ["npm", "start"]

    这个 Dockerfile 定义了一个用于构建 Next.js 应用程序的 Docker 镜像。下面是逐行解释:

    1. FROM node:22-alpine AS base

    这一行指定了基础镜像,这里使用的是 node:22-alpine,它是一个包含 Node.js 22 版本的 Alpine Linux 镜像,Alpine Linux 是一个轻量级的 Linux 发行版,通常用于 Docker 镜像以减小体积。

    2. ENV NEXT_TELEMETRY_DISABLED 1

    这里设置了一个环境变量 NEXT_TELEMETRY_DISABLED 并将其值设为 1,这意味着在构建过程中将禁用 Next.js 的遥测功能。遥测是 Next.js 收集匿名使用数据的功能,用于改进框架。

      3. WORKDIR /app

      设置工作目录为 /app,这意味着接下来的所有操作(如复制文件、执行命令等)都将在这个目录下进行。

        4. COPY package*.json ./

        将构建上下文中的 package.jsonpackage-lock.json 文件复制到工作目录中。这些文件包含了项目依赖的信息。

          5. RUN npm install

          运行 npm install 命令来安装 package.json 中列出的所有依赖。

            6. COPY . .

            将构建上下文中的其余文件复制到工作目录中。这通常是应用程序的代码。

              7. RUN npm run build

              运行 npm run build 命令来构建 Next.js 应用程序。这通常会生成优化过的静态文件,准备部署。

                8. EXPOSE 3000

                声明容器在 3000 端口上监听。这是 Next.js 应用程序默认的端口。

                  9. CMD ["npm", "start"]

                  设置容器启动时默认执行的命令为 npm start。这将启动 Next.js 应用程序。

                    这是一个简单的Dockerfile,可以用于Next.js 14MacOS 14Amazon Linux 2023Alibaba Cloud Linux3环境。如何有其它需求的话也可以加入自己的特定配置。

                    虽然没有试过,但相信在其它环境下使用也没有问题。

                    官方提供了一个Dockerfile(点击跳转),比较复杂,而且有一些问题,不能直接使用,我稍微改了一下,用于启动官方的《Learn Next.js》教程,亲测可用。

                    以下是我修改后的Dockerfile,仅供参考。

                    FROM node:22-alpine AS base
                    
                    RUN apk add python3 py3-pip
                    RUN apk add g++ && apk add make
                    RUN apk add curl
                    
                    # Install dependencies only when needed
                    FROM base AS deps
                    
                    # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
                    RUN apk add --no-cache libc6-compat
                    WORKDIR /app
                    
                    # Install dependencies based on the preferred package manager
                    COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
                    RUN \
                        if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
                        elif [ -f package-lock.json ]; then npm ci; \
                        elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
                        else echo "Lockfile not found." && exit 1; \
                        fi
                    
                    RUN npm i sharp@0.32.6
                    
                    # Rebuild the source code only when needed
                    FROM base AS builder
                    WORKDIR /app
                    COPY --from=deps /app/node_modules ./node_modules
                    
                    COPY . .
                    RUN mv .env_production .env
                    
                    # If you use prisma, should run the command, else comment it
                    RUN npx prisma generate
                    
                    # Next.js collects completely anonymous telemetry data about general usage.
                    # Learn more here: https://nextjs.org/telemetry
                    # Uncomment the following line in case you want to disable telemetry during the build.
                    ENV NEXT_TELEMETRY_DISABLED 1
                    
                    RUN \
                        if [ -f yarn.lock ]; then yarn run build; \
                        elif [ -f package-lock.json ]; then npm run build; \
                        elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \
                        else echo "Lockfile not found." &&  exit 1; \
                        fi
                    
                    # Production image, copy all the files and run next
                    FROM base AS runner
                    WORKDIR /app
                    
                    ENV NODE_ENV production
                    # Uncomment the following line in case you want to disable telemetry during runtime.
                    ENV NEXT_TELEMETRY_DISABLED 1
                    
                    RUN addgroup --system --gid 1001 nodejs
                    RUN adduser --system --uid 1001 nextjs
                    
                    COPY --from=builder /app/public ./public
                    
                    # Set the correct permission for prerender cache
                    RUN mkdir .next
                    RUN chown nextjs:nodejs .next
                    
                    # Automatically leverage output traces to reduce image size
                    # https://nextjs.org/docs/advanced-features/output-file-tracing
                    COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
                    COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
                    
                    USER nextjs
                    
                    EXPOSE 3000
                    
                    ENV PORT 3000
                    
                    # server.js is created by next build from the standalone output
                    # https://nextjs.org/docs/pages/api-reference/next-config-js/output
                    
                    CMD HOSTNAME="0.0.0.0" node server.js


                    评论

                    发表回复

                    您的邮箱地址不会被公开。 必填项已用 * 标注