如何使用 node-sharp for docker 运行 next.js

mik*_*866 6 docker next.js sharp

我在为 Dockerfile 实现 Sharp 时遇到问题。

Error: 'sharp' is required to be installed in standalone mode for the image 
optimization to function correctly
Run Code Online (Sandbox Code Playgroud)

Next.js 和 Sharp 非常适合本地开发:

  • 下一个 12.0.1
  • 锐利0.30.2
  • 节点 16.xx
  • npm 8.xx
  • 操作系统 - macOS 蒙特利 - 12.2.1、M1 PRO

next.config.js

module.exports = {
  experimental: {
    outputStandalone: true,
  },
Run Code Online (Sandbox Code Playgroud)

}

Dockerfile:

FROM node:16-alpine 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
COPY package.json package-lock.json ./ 
RUN npm ci

# Rebuild the source code only when needed
FROM node:16-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

# 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 npm run build

# Production image, copy all the files and run next
FROM node:16-alpine 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

# You only need to copy next.config.js if you are NOT using the default configuration
COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/next.config.js ./
COPY --from=builder /app/next-i18next.config.js ./
COPY --from=builder /app/next-sitemap.js ./cd
COPY --from=builder /app/jsconfig.json ./jsconfig.json
COPY --from=builder /app/data/ ./data
COPY --from=builder /app/components/ ./components
COPY --from=builder /app/utils/ ./utils
COPY --from=builder /app/assets/ ./assets

# 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

CMD ["node", "server.js"]
Run Code Online (Sandbox Code Playgroud)

.env 文件:

NEXT_SHARP_PATH=/tmp/node_modules/sharp next start
Run Code Online (Sandbox Code Playgroud)

Sharp 安装在 package.json 中

我检查了 Next/Vercel 的图:

运行 Docker:

docker build --no-cache . -t website-app && docker run --name website -p 3000:3000 website-app
Run Code Online (Sandbox Code Playgroud)

Flu*_*tor 5

对于 中的最后一步(标记为“runner”的步骤)Dockerfile,将基本图像替换为node:16-slim。该映像基于 Debian,因此它比alpine变体大约大 20 MB,但它具有运行sharp.

当使用与您类似的时Dockerfile,我发现NEXT_SHARP_PATH使用基于 Debian 的 Node 映像时不需要环境变量。

作为参考,这里是有关错误消息的 NextJS 文档: https: //nextjs.org/docs/messages/sharp-missing-in-product

更新:您还可以libc使用以下标志指定在基本 Docker 映像中找到的实现:

RUN npm_config_platform=linux npm_config_arch=x64 npm_config_libc=glibc npm ci
Run Code Online (Sandbox Code Playgroud)

有关这些标志的更多信息,请参阅Sharp 的文档


mik*_*866 0

我想到了。

NEXT_SHARP_PATH=/tmp/node_modules/sharp next start从 .env 中删除了本地 docker,如果没有,则无法与 node-sharp 一起使用NEXT_SHARP_PATH,这很奇怪。

但我使用 Docker 将其部署在我的 K8s 集群中,并且它按预期工作。