У меня есть докеризованный проект 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
@DavidMaze Я вижу эти ошибки, когда запускаю docker-compose up --build
. Я также думаю, что первая ошибка возникает из-за сценария после установки, хотя я думал, что схема доступна и ее не нужно копировать, поскольку я добавил папку prisma в блок томов. И что вы имеете в виду под блокировкой томов, из-за которой мой код ничего не запускает в образе? Я добавил эти тома, чтобы синхронизировать их с контейнером при написании кода.
И это та часть, где я застреваю. Я не понимаю, почему вдруг появляется эта ошибка. Я использую последнюю версию Хосе, проверил их форумы и ничего не нашел.
https://github.com/panva/jose/issues/690#issuecomment-2194955332
Просто беги npm upgrade jose
Хосе уже использует самую последнюю версию
Вот почему вы не получаете ошибку в соответствии с вашим собственным ответом.
Итак, повозившись, я каким-то образом решил проблему, но не совсем понимаю, почему.
Я удалил сценарий после установки, чтобы иметь возможность раскручивать контейнер. Затем я получаю ошибку Хосе, как указано в моем вопросе, но, по крайней мере, контейнер работает. Я вошел в контейнер с помощью 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. (К счастью, мне действительно нужна была постустановка хостинга на Верселе)
Если у кого-то есть какое-либо объяснение или представление о том, что там происходит, я ценю ваш вклад.
Вы видите эти ошибки при создании образа или запуске контейнера? Похоже, что первая ошибка может возникнуть из-за вашего крючка
postinstall
, поэтому вам может потребоватьсяCOPY
файл схемы в изображение передRUN npm install
. Блокvolumes:
означает, что вы на самом деле не запускаете какой-либо код в своем образе, что может привести к непредсказуемому поведению в зависимости от того, что находится в хост-системе; имеет ли значение удаление всего этого блока?