📚

M1 MacのDocker上のNestJSでPrismaを動かすまでに詰まった点

2022/05/07に公開

はじめに

  • 目的とした構成
    • Docker
    • NestJS
    • Prisma
      • MySQL
  • 自分の環境
    • M1 Mac

Prisma+NestJSの公式ドキュメント

https://docs.nestjs.com/recipes/prisma

起きた問題と解決策

Error: Unknown binaryTarget linux-arm64-openssl-undefined and no custom binaries were provided

やったこと

npx prisma init

厳密には、docker-compose exec api(nodeが動いているコンテナ) npx prisma init

解決策

全く同じ内容のエラーではありませんでしたがとてもよく似た内容のissueがあり、その中のコメントにあった内容を参考にDockerfileを書くと動きました

FROM positivly/prisma-binaries:latest as prisma
FROM node:16.13.2-alpine

RUN apk add --no-cache libc6-compat openssl bash
RUN npm i -g @nestjs/cli
WORKDIR /api
CMD ["npm", "run", "start:dev"]

ENV PRISMA_QUERY_ENGINE_BINARY=/prisma-engines/query-engine \
  PRISMA_MIGRATION_ENGINE_BINARY=/prisma-engines/migration-engine \
  PRISMA_INTROSPECTION_ENGINE_BINARY=/prisma-engines/introspection-engine \
  PRISMA_FMT_BINARY=/prisma-engines/prisma-fmt \
  PRISMA_CLI_QUERY_ENGINE_TYPE=binary \
  PRISMA_CLIENT_ENGINE_TYPE=binary
COPY --from=prisma /prisma-engines/query-engine /prisma-engines/migration-engine /prisma-engines/introspection-engine /prisma-engines/prisma-fmt /prisma-engines/

https://github.com/prisma/prisma/issues/8478#issuecomment-1095544159

備考:試したが動作が確認できなかった方法

概要: 40分経ってもdocker buildが終わらなかったため諦めました。

詳細

こちらを参考に試しました

Dockerfileの FROM nodeの行を以下に書き換える

FROM --platform=linux/amd64 node:16-alpine

結果、40分経ってもdocker buildが終わらなかったため諦めました。
ただし、元のコメントにもreally slowと書かれていたので根気強く粘れば動いたのかもしれません...

Error: P3014 Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases.

やったこと

npx prisma migrate dev --name init

エラー詳細

Error: P3014

Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases. Read more about the shadow database (and workarounds) at https://pris.ly/d/migrate-shadow

解決策

  1. mysqlを実行しているコンテナに入る
  2. mysql -u root -p → パスワード入力
  3. grant all on *.* to {DBユーザ};
    a. DBユーザはnpx prisma init時に作成される、.envに設定したDATABASE_URLに含まれるユーザ
    b. (付与する権限はallでなくていいとは思うのですが、開発用のためとりあえず動くものにしています)

TypeError: collection is not iterable

やったこと

npx prisma generate

エラー詳細

Error:
TypeError: collection is not iterable
    at keyBy (/api/node_modules/@prisma/client/generator-build/index.js:57757:21)
    at Object.getTypeMap (/api/node_modules/@prisma/client/generator-build/index.js:59540:17)
    at new DMMFHelper (/api/node_modules/@prisma/client/generator-build/index.js:59437:25)
    at new TSClient (/api/node_modules/@prisma/client/generator-build/index.js:60719:17)
    at buildClient (/api/node_modules/@prisma/client/generator-build/index.js:60965:18)
    at generateClient (/api/node_modules/@prisma/client/generator-build/index.js:61036:47)
    at async LineStream.<anonymous> (/api/node_modules/@prisma/client/generator-build/index.js:54255:24)

解決策

prisma, @prisma/clientのバージョンを3.9に固定

上記、Error: Unknown binaryTarget linux-arm64-openssl-undefined and no custom binaries were providedエラーの解決策と同じissueの別のコメントに、positivly/prisma-binaries:latestがprisma 3.9用であるような記述があった

https://github.com/prisma/prisma/issues/8478#issuecomment-1098071324

Discussion