孅いエンジニアブログ

Cockroach DBをDocker(Compose)で立ち上げて、Prismaからアクセスする

とあるウェブアプリを作っていて、そのアプリがNext.jsとCockroachDBとPrismaで動いています。

そしてローカル環境はDocker Composeでまとめて動かしているのですが、今までCockroachDBのローカル環境は作らずPostgreSQLでなんとかしていたのですが、さすがに作りたいなと思い、作ってみました。

そこでDocker Compose + CockroachDB + Prismaの環境立ち上げとか記事を調べてみたのですが、全然見つからない!

公式ドキュメントみてもなんかちょっとよく分からなかった...(読解力 & 技術力の欠如)

まぁ結局なんとかしてみたので簡単にまとめます。

結論

とりあえず簡単に環境立ち上げまでの完成形を説明します。

クラウド上のCockroachDBにアクセスできるようにPrismaの設定とかはもう終わってる前提で行きます。

あくまでローカル上で立ち上げる際の説明です。

ステップ1 Docker Composeで立ち上げ

Dockerfileを作ります。

FROM cockroachdb/cockroach:v23.1.22

まぁ、これだけなんですけど。

compose.ymlを書きます。

services:
  app:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    tty: true
    stdin_open: true
    init: true
    environment:
      TZ: Asia/Tokyo
      CHOKIDAR_USEPOLLING: 1
      HOST: 0.0.0.0
    ports:
      - "10111:10111"
    working_dir: /app/
    volumes:
      - ./:/app/

  db:
    build:
      context: .
      dockerfile: ./docker/db/Dockerfile
    tty: true
    stdin_open: true
    ports:
      - "26257:26257"
      - "8080:8080"
    environment:
      TZ: Asia/Tokyo
      COCKROACH_USER: root
      COCKROACH_PASSWORD: root
    command: start-single-node --insecure

appがPrismaを動かすアプリです。Node.js用のコンテナですね。portsやworking_dirはご自身の環境に合わせてください。

dbがcockrachDB用のコンテナです。公式サイトには「3つのノードが~なんたら~」って言ってるのですがローカルだしとりあえず1でいいやの精神で行ってます。

COCKROACH_USERがユーザー名で、COCKROACH_PASSWORDがパスワードです。そのままですね。

ポートはDB接続用の26257と、CockroachDBのコンソール?管理画面?的なのにアクセスできる8080を指定してます。

これでコンテナたちを起動します。

docker compose up -d

ステップ2 接続テスト

これでコンテナが起動するとCockroachDBには接続できる状態だと思います。接続してみます。

ウェブ上でhttp://localhost:8080/にアクセスしてみてください。こういう画面に行けたらOKです。

SQLも打ってみます。

ご自身のターミナルに戻ってもらって、DBに接続してSQL shellを開きます。

docker compose exec -it db ./cockroach sql --insecure

このコマンドで接続できます。

Welcome to ~って歓迎されます。

show databases;

って打ってみましょう。

接続できてますね。

ステップ3 Prismaの設定

クラウド上のCockroachDBには接続できる前提(勝手に前提にしましたが)なので、もうschema.prismaとかは手元にあると思います。

なのであとはenvファイルを書き換えるだけですね。こんな感じです。

DATABASE_URL="postgresql://root:root@db:26257/defaultdb"

CockroachDBはPostgreSQLベースなので、URLはpostgresql://[ユーザー]:[パスワード]@[ホスト]:[ポート]/[DB名]です。なので、先程compose.ymlで設定した、ユーザー名はroot、パスワードもroot、ホストはcompose.ymlのサービス名ですね、dbを設定して、ポートに26257、DB名にdefaultdbを設定している感じです。

一応Prismaのschema.prismaの例も記載しておきます。

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "cockroachdb"
  url      = env("DATABASE_URL")
}

// 例としてusersテーブル
model User {
  id       String  @id @default(cuid())
  email    String  @unique
  password String

  @@map("users")
}

こんな感じでPrismaでローカルのCockroachDBにアクセスできるかと思います。

pushしてみます。

npx prisma db push

動いてそうですね。

良いんじゃないでしょうか!

間違ってるとことかあれば教えてください。