使用 Prisma Dockerize NextJS 应用程序

Lou*_*ist 4 docker next.js prisma

我创建了一个 NextJS 应用程序,用于连接到我使用 Prisma 的数据库。当我在计算机上启动该应用程序时,一切正常。不幸的是,当我尝试在 Docker 容器中运行应用程序时收到错误消息。可以创建并启动容器。还可以显示应用程序的起始页(那里还没有数据库查询)。但是,当我单击有数据库查询的第一页时,我在控制台中收到错误代码 500 - 初始服务器错误和以下错误消息:

PrismaClientInitializationError: Unknown PRISMA_QUERY_ENGINE_LIBRARY undefined. Possible binaryTargets: darwin, darwin-arm64, debian-openssl-1.0.x, debian-openssl-1.1.x, rhel-openssl-1.0.x, rhel-openssl-1.1.x, linux-arm64-openssl-1.1.x, linux-arm64-openssl-1.0.x, linux-arm-openssl-1.1.x, linux-arm-openssl-1.0.x, linux-musl, linux-nixos, windows, freebsd11, freebsd12, openbsd, netbsd, arm, native or a path to the query engine library.
You may have to run prisma generate for your changes to take effect.
    at cb (/usr/src/node_modules/@prisma/client/runtime/index.js:38689:17)
    at async getServerSideProps (/usr/src/.next/server/pages/admin/admin.js:199:20)
    at async Object.renderToHTML (/usr/src/node_modules/next/dist/server/render.js:428:24)
    at async doRender (/usr/src/node_modules/next/dist/server/next-server.js:1144:38)
    at async /usr/src/node_modules/next/dist/server/next-server.js:1236:28
    at async /usr/src/node_modules/next/dist/server/response-cache.js:64:36 {
  clientVersion: '3.6.0',
  errorCode: undefined
}
Run Code Online (Sandbox Code Playgroud)

我的 Dockerfile:

# Dockerfile

# base image
FROM node:16-alpine3.12

# create & set working directory
RUN mkdir -p /usr/src
WORKDIR /usr/src

# copy source files
COPY . /usr/src

COPY package*.json ./
COPY prisma ./prisma/

# install dependencies
RUN npm install

COPY . .

# start app
RUN npm run build
EXPOSE 3000
CMD npm run start
Run Code Online (Sandbox Code Playgroud)

我的 docker-compose.yaml:

version: "3"

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: web
    restart: always
    volumes:
      - ./:/usr/src/app
    ports:
      - "3000:3000"
    env_file:
      - .env
Run Code Online (Sandbox Code Playgroud)

我的package.json:

{
    "name": "supermarket",
    "version": "0.1.0",
    "private": true,
    "scripts": {
        "dev": "next dev",
        "build": "next build",
        "start": "next start",
        "lint": "next lint"
    },
    "prisma": {
        "schema": "prisma/schema.prisma"
      },
    "dependencies": {
        "@prisma/client": "^3.6.0",
        "axios": "^0.22.0",
        "cookie": "^0.4.1",
        "next": "latest",
        "nodemailer": "^6.6.5",
        "react": "17.0.2",
        "react-cookie": "^4.1.1",
        "react-dom": "17.0.2"
    },
    "devDependencies": {
        "eslint": "7.32.0",
        "eslint-config-next": "11.1.2",
        "prisma": "^3.6.0"
    }
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*ist 8

我已经找到错误了。我认为这是M1芯片的问题。我更改node:16-alpine3.12node:lts并向 Dockerfile 添加了一些命令,现在如下所示:

# base image
FROM node:lts

# create & set working directory
RUN mkdir -p /usr/src
WORKDIR /usr/src

# copy source files
COPY . /usr/src

COPY package*.json ./
COPY prisma ./prisma/

RUN apt-get -qy update && apt-get -qy install openssl

# install dependencies
RUN npm install

RUN npm install @prisma/client

COPY . .
RUN npx prisma generate --schema ./prisma/schema.prisma
# start app
RUN npm run build
EXPOSE 3000
CMD npm run start
Run Code Online (Sandbox Code Playgroud)

我希望这也可以帮助其他人