У Docker Compose внезапно возникли проблемы с Prisma и Jose

У меня есть докеризованный проект Next.js, использующий Prisma. Я работал над этим как обычно, ничего не менял в настройке Docker, расположении файлов или пакетов, я просто хотел пересобрать контейнер, чтобы получить новые переменные среды.

Затем я получаю эту ошибку:

90.79 > [email protected] postinstall
90.79 > prisma generate
90.79 
91.03 Error: Could not find Prisma Schema that is required for this command.
91.03 You can either provide it with `--schema` argument, set it as `prisma.schema` in your package.json or put it into the default location.
91.03 Checked following paths:
91.03 
91.03 schema.prisma: file not found
91.03 prisma/schema.prisma: file not found
91.03 prisma/schema: directory not found
91.03 
91.03 See also https://pris.ly/d/prisma-schema-location
91.03 npm notice
91.03 npm notice New minor version of npm available! 10.7.0 -> 10.8.1
91.03 npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.8.1
91.03 npm notice To update run: npm install -g [email protected]
91.03 npm notice
91.03 npm error code 1
91.03 npm error path /app
91.03 npm error command failed
91.03 npm error command sh -c prisma generate
91.04 
91.04 npm error A complete log of this run can be found in: /root/.npm/_logs/2024-06-28T08_02_21_293Z-debug-0.log
------
failed to solve: process "/bin/sh -c npm install" did not complete successfully: exit code: 1

Это мой раздел сценариев package.json:

"scripts": {
    "dev": "next dev",
    "build": "next-swagger-doc-cli next-swagger-doc.json && next build",
    "start": "next start",
    "lint": "next lint",
    "resetdb": "cross-env NODE_ENV=test npx prisma db push --force-reset && npx prisma db seed",
    "postinstall": "prisma generate",
    "generate-docs": "next-swagger-doc-cli next-swagger-doc.json",
    "test": "cross-env NODE_ENV=test jest",
    "test:watch": "cross-env NODE_ENV=test jest --watch"
  },
  "prisma": {
    "seed": "tsx prisma/seed.ts"
  },

До этого у меня не было проблем с запуском этих сценариев. Также не имеет значения ошибка, когда я указываю --schema='/prisma/schema.prisma'. Моя файловая структура следующая:

  • /корень

    • пакет.json

    • /призма

      • схема.призма

Когда я удаляю сценарий после установки, эта часть, похоже, работает. Постинсталл мне все равно больше не нужен - он был для генерации erd, но соответствующий пакет имеет уязвимости.

Однако теперь мое промежуточное программное обеспечение для аутентификации создает проблемы, особенно Jose, который я использую для JWT.

web-1       |  ○ Compiling / ...
web-1       |  ⨯ ./node_modules/jose/dist/node/esm/lib/decrypt_key_management.js
web-1       | Attempted import error: 'normalizePrivateKey' is not exported from '../runtime/normalize_key.js' (imported as 'normalize').
web-1       | 
web-1       | Import trace for requested module:
web-1       | ./node_modules/jose/dist/node/esm/lib/decrypt_key_management.js
web-1       | ./node_modules/jose/dist/node/esm/jwe/flattened/decrypt.js
web-1       | ./node_modules/jose/dist/node/esm/index.js
web-1       | ./app/lib/auth.ts
web-1       | ./app/lib/utils/api-authorization.ts
web-1       | ./app/(general)/layout.tsx
web-1       |  ⨯ ./node_modules/jose/dist/node/esm/lib/decrypt_key_management.js
web-1       | Attempted import error: 'normalizePrivateKey' is not exported from '../runtime/normalize_key.js' (imported as 'normalize').
web-1       | 
web-1       | Import trace for requested module:
web-1       | ./node_modules/jose/dist/node/esm/lib/decrypt_key_management.js
web-1       | ./node_modules/jose/dist/node/esm/jwe/flattened/decrypt.js
web-1       | ./node_modules/jose/dist/node/esm/index.js
web-1       | ./app/lib/auth.ts
web-1       | ./app/ui/search/pagination.tsx
web-1       | ./app/(general)/page.tsx
web-1       |  ⨯ ./node_modules/jose/dist/node/esm/lib/decrypt_key_management.js
web-1       | Attempted import error: 'normalizePrivateKey' is not exported from '../runtime/normalize_key.js' (imported as 'normalize').
web-1       | 
web-1       | Import trace for requested module:
web-1       | ./node_modules/jose/dist/node/esm/lib/decrypt_key_management.js
web-1       | ./node_modules/jose/dist/node/esm/jwe/flattened/decrypt.js
web-1       | ./node_modules/jose/dist/node/esm/index.js
web-1       | ./app/lib/auth.ts
web-1       | ./app/ui/search/pagination.tsx
web-1       | ./app/(general)/page.tsx
web-1       |  ⨯ ./node_modules/jose/dist/node/esm/lib/decrypt_key_management.js
web-1       | Attempted import error: 'normalizePrivateKey' is not exported from '../runtime/normalize_key.js' (imported as 'normalize').
web-1       | 
web-1       | Import trace for requested module:
web-1       | ./node_modules/jose/dist/node/esm/lib/decrypt_key_management.js
web-1       | ./node_modules/jose/dist/node/esm/jwe/flattened/decrypt.js
web-1       | ./node_modules/jose/dist/node/esm/index.js
web-1       | ./app/lib/auth.ts
web-1       | ./app/ui/search/pagination.tsx
web-1       | ./app/(general)/page.tsx

И это та часть, где я застреваю. Я не понимаю, почему вдруг появляется эта ошибка. Я использую последнюю версию Хосе, проверил их форумы и ничего не нашел.

Вот мой docker-compose:

services:
  postgres:
    image: postgres
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    ports:
      - 5432:5432
    volumes:
      - postgres-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "sh -c 'pg_isready -U postgres -d postgres'"]
      interval: 10s
      timeout: 3s
      retries: 3

  web:
    build:
      context: .
      args:
        - VERCEL_TOKEN=${VERCEL_TOKEN}
    volumes:
      - ./app:/app/app
      - ./prisma:/app/prisma
      - ./public:/app/public
      - ./swagger:/app/swagger
    ports:
      - 3000:3000
      - 5555:5555
    depends_on:
      - postgres

volumes:
  postgres-data:

Вот мой Dockerfile:

FROM node:20

WORKDIR /app

COPY package.json ./

RUN npm install

RUN npm install --global vercel@latest

COPY . .

ARG VERCEL_TOKEN
RUN vercel env pull .env --environment=Development --token=$VERCEL_TOKEN

RUN npx prisma generate --schema ./prisma/schema.prisma

ENV POSTGRES_DATABASE=postgres
ENV POSTGRES_USER=postgres
ENV POSTGRES_PASSWORD=postgres
ENV POSTGRES_HOST=postgres
ENV POSTGRES_URL=postgres://postgres:postgres@postgres:5432/postgres?connect_timeout=300&schema=public
ENV POSTGRES_PRISMA_URL=postgres://postgres:postgres@postgres:5432/postgres?connect_timeout=300&schema=public
ENV POSTGRES_URL_NON_POOLING=postgres://postgres:postgres@postgres:5432/postgres?connect_timeout=300&schema=public
ENV POSTGRES_PORT=5432

EXPOSE 3000

CMD ["npm", "run", "dev"]

Я ничего не нашел в Интернете по этой ошибке, похоже, ни у кого никогда не было такой проблемы. Я очистил все докер-контейнеры и запустил обрезку системы докеров с чистой перестройкой, но безуспешно. Я не знаю, что еще здесь попробовать.

Обновлено: мой докеригнор:

**/node_modules
.next
.swc
.env

Вы видите эти ошибки при создании образа или запуске контейнера? Похоже, что первая ошибка может возникнуть из-за вашего крючка postinstall, поэтому вам может потребоваться COPY файл схемы в изображение перед RUN npm install. Блок volumes: означает, что вы на самом деле не запускаете какой-либо код в своем образе, что может привести к непредсказуемому поведению в зависимости от того, что находится в хост-системе; имеет ли значение удаление всего этого блока?

David Maze 28.06.2024 12:22

@DavidMaze Я вижу эти ошибки, когда запускаю docker-compose up --build. Я также думаю, что первая ошибка возникает из-за сценария после установки, хотя я думал, что схема доступна и ее не нужно копировать, поскольку я добавил папку prisma в блок томов. И что вы имеете в виду под блокировкой томов, из-за которой мой код ничего не запускает в образе? Я добавил эти тома, чтобы синхронизировать их с контейнером при написании кода.

Ecki 28.06.2024 17:11
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
2
131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

И это та часть, где я застреваю. Я не понимаю, почему вдруг появляется эта ошибка. Я использую последнюю версию Хосе, проверил их форумы и ничего не нашел.

https://github.com/panva/jose/issues/690#issuecomment-2194955332

Просто беги npm upgrade jose

Хосе уже использует самую последнюю версию

Ecki 28.06.2024 17:04

Вот почему вы не получаете ошибку в соответствии с вашим собственным ответом.

Filip Skokan 28.06.2024 17:53
Ответ принят как подходящий

Итак, повозившись, я каким-то образом решил проблему, но не совсем понимаю, почему.

Я удалил сценарий после установки, чтобы иметь возможность раскручивать контейнер. Затем я получаю ошибку Хосе, как указано в моем вопросе, но, по крайней мере, контейнер работает. Я вошел в контейнер с помощью docker exec -it hey-shop-web-1 bash и удалил папку node_modules. Затем я запустил npm install внутри контейнера, остановил контейнеры и запустил docker-compose up без флага сборки. И теперь все работало, однако я не мог запустить docker-compose up --build, не получив снова эту ошибку. Эту часть мне удалось решить, изменив мой Dockerfile с COPY package.json ./ на COPY package*.json ./. И теперь он работает идеально каждый раз.

В конце концов единственное, что я сделал, это изменил свой Dockerfile на:

FROM node:20

WORKDIR /app

COPY package*.json ./

RUN npm install

RUN npm install --global vercel@latest

COPY . .

ARG VERCEL_TOKEN
RUN vercel env pull .env --environment=Development --token=$VERCEL_TOKEN

ENV POSTGRES_DATABASE=postgres
ENV POSTGRES_USER=postgres
ENV POSTGRES_PASSWORD=postgres
ENV POSTGRES_HOST=postgres
ENV POSTGRES_URL=postgres://postgres:postgres@postgres:5432/postgres?connect_timeout=300&schema=public
ENV POSTGRES_PRISMA_URL=postgres://postgres:postgres@postgres:5432/postgres?connect_timeout=300&schema=public
ENV POSTGRES_URL_NON_POOLING=postgres://postgres:postgres@postgres:5432/postgres?connect_timeout=300&schema=public
ENV POSTGRES_PORT=5432

EXPOSE 3000

CMD ["npm", "run", "dev"]

Я думал, что мои node_modules MacOS каким-то образом попали в контейнер Linux, и это вызвало проблему, но я не знаю, как это может быть, когда я специально добавил **/node_modules в .dockerignore и все равно устанавливаю их в свой Dockerfile. Но я также заметил, что установка узловых модулей теперь стала намного быстрее. Когда у меня возникали ошибки, npm install занимало почти 500 секунд, тогда как после исправления теперь это занимает примерно 30 секунд. Я где-то читал, что npm install будет очень долго находиться в докер-контейнере при синхронизации с основной ОС. Я думаю, что это могло быть именно то, что произошло, и то, что установка теперь происходит так быстро, свидетельствует о том, что теперь синхронизация не происходит. Но я не знаю, как бы это произошло вообще.

Во-вторых, исчезла и послеустановочная ошибка. Мне удалось удалить процесс генерации призмы из файла Dockerfile и добавить сценарий после установки обратно в package.json. (К счастью, мне действительно нужна была постустановка хостинга на Верселе)

Если у кого-то есть какое-либо объяснение или представление о том, что там происходит, я ценю ваш вклад.

Другие вопросы по теме