expressとmySQLならデプロイできるのに、prismaが入るとエラーにはまる。
やっとエラーから脱出したので、その方法をまとめます!
WebSocket
prismaの環境変数にDATABASE_URLを指定しますが、ローカルで開発する時とGCPで実行する時とでurlのスキーマが異なります。
例えば、ローカル開発環境では以下のように指定します。
DATABASE_URL="mysql://root:password@localhost:3306/データベース名"しかし、GCP上で実行する場合、以下のようにsocket を追加する必要があります。
DATABASE_URL=mysql://root:password@localhost:3306/データベース名?socket=/cloudsql/接続名接続名はCloud SQLインスタンスの接続名です。この形式で、PrismaがCloud SQLに接続できるようになります。
Dockerfile
Dockerfile内でnpx prisma migrate deployやnpx prisma db seedを実行するとビルドエラーが生じます。
これは、コンテナ実行前にデータベースとの接続ができないためです。
ただし、prisma-clientの生成はデータベースを介さないので、npx prisma generateは実行することができます。
npx prisma generateがないとエラーが生じるので忘れずに実行します。
コンテナの軽量化は後回しにして、ファイルを全てコンテナに入れます。
FROM node:20
WORKDIR /app
COPY . .
RUN npm install
RUN npx prisma generate
EXPOSE 3000
CMD ["npm", "start"]マイグレーションの場所
アプリのデプロイ時に実行できないマイグレーションは、Cloud Runジョブで行います!
この方法により、アプリケーションのサービスとは独立した形でマイグレーションを管理できます。

Cloud Runサービスの横にあります。
サービス同様コンテナをデプロイし実行できます。
Cloud Runジョブのコンテナではnpx migrate deployなどのコマンドが使用できます。
アプリのコンテナとは別に、マイグレーションを実行するコンテナをを作ってここで実行します。
環境変数DATABASE_URLには、アプリに使用するデータベースと同じ値を使用します。
これにより、アプリでもマイグレーション済みのデータベースを使用できるようになります!
マイグレーション用のコンテナの作り方
Archfact Registryにて、アプリのリポジトリと別にマイグレーション用のリポジトリを作成します。
まずは、アプリをローカルでマイグレートしsqlを生成しておきます。
それから、以下の内容でスクリプトファイルmigrate.tsを作成します。
import { execSync } from 'child_process';
async function main() {
try {
console.log('Starting database migration...');
// データベースマイグレーションの実行
execSync('npx prisma db seed', { stdio: 'inherit' });
console.log('Migration completed successfully');
} catch (error) {
console.error('Migration failed:', error);
}
}
main();execSyncは、Node.jsでシェルコマンドを実行させるメソッドです。
上記のスクリプトを実行することでprismaのコマンドを実行できます。
それから、以下の内容でDockerfileを作成します。
FROM node:20
WORKDIR /app
COPY . .
RUN npm install
RUN npx prisma generate
EXPOSE 3000
CMD ["ts-node", "src/migrate.ts"]最後にdockerでビルドし、マイグレーション用のリポジトリにプッシュします。
まとめ
環境変数と、マイグレーションする場所を変更することで、マイグレーションが成功しました。
デプロイできるようになると、開発のモチベーションがぐっとあがりますね!
Contribute to risu043/prisma-express dev...
GitHub - risu043/prisma-express...
github.com
