「それでも、と言い続けろ」
マリーダクルスの言い付けを守り続けています。
- 朝起きたけどクソ寒いとき
- ベンチプレスで潰れそうなとき
- 有酸素運動が憂鬱なとき
- エラーが全く直らないとき
- エヴァの時短駆け抜けたとき
- タバコ、エナジードリンクの誘惑に負けそうなとき
自分に負けそうなときでも、マリーダさんの言い付けを思い出し、自分を奮い立たせています。
そう、僕はユニコーンガンダムのパイロットなのです。
Docker × NestJSでデータベース環境(postgres)を作りたい!
いろいろ省きますが、僕は現在docker上でNestJS環境を構築し、開発を進めています。
僕は普段Laravelを利用しているので、NestJSを使うのはワクワクしています。
また、データベースも普段はMySQLを利用していたので、勉強の意味も兼ねてpostgres環境でやろうと思いました。
セットアップやパッケージのインストール等は省きます。
ちなみにパッケージはprismaを利用しています。
以下の公式ドキュメントを参考にしてください。(マイグレーションのNestJS公式ドキュメント)
https://docs.nestjs.com/recipes/prisma#create-two-database-tables-with-prisma-migrate
NestJS、データベースの環境は以下です。
docker.compose.yml
db:
image: postgres:latest
environment:
POSTGRES_USER: jony_newtype
POSTGRES_PASSWORD: password
POSTGRES_DB: app_database
volumes:
- postgres_volume:/var/lib/postgresql/data
- ./docker/postgres/script:/docker-entrypoint-initdb.d
- ./docker/postgres/postgresql.conf:/etc/postgresql/postgresql.conf
ports:
- '5432:5432'
networks:
- app-networks
nestjs:
build:
context: ./api
dockerfile: Dockerfile
volumes:
- ./api/nest-api:/app
ports:
- '3000:3000'
networks:
- app-networks
networks:
app-networks:
driver: bridge
volumes:
postgres_volume:
他にもコンテナはありますが、省いています。
まずここで注目してほしいのが同じnetworkに乗せているということです。
バックエンドのコンテナとデータベースのコンテナが同じnetworkに乗っていないと、データベースのホスト名を識別できず、直接通信ができない
次にバックエンド側のマイグレーション関連のファイルです。
主に以下のファイルが重要です。
・schema.prisma
・.env
最初にschema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
----これより下にテーブル仕様
次に.env
DATABASE_URL="postgresql://jony_newtype:password@db:5432/app_database?schema=newtype"
DATABASE_USER=jony_newtype
DATABASE_PASSWORD=password
DB_HOST=db
.env側からユーザやパスワードを環境変数に代入する必要があるのは言うまでもありませんが、ここで注目してほしいのはschemaとDB_HOSTという変数です。
僕はこれまでデータベースのschemaという概念を理解できていませんでした。
これはデータベースとテーブルの間にあるレイヤーです。
これを間違っていたため、マイグレーションが許されませんでした。
またDB_HOSTの環境変数についてですが、
これを代入しないと、URL上でコンテナ名であるデータベースホストを識別してくれません。
僕の場合はこの"db"はコンテナのサービス名です。
データベースのエンドポイントを示すために必要な記述ですが、DB_HOSTに代入しないとただのよくわからん文字列と判別されてしまうようです。
終わり
NestJSで開発を進めていますが、結構楽しいです。
僕はNestJSのロゴと色が大好きです。