以下は、NestJSアプリケーションとDockerコンテナ内のPostgreSQLデータベースが接続できなかった問題について解決策をまとめた記事です。
タイトル: NestJS Dockerで立ち上げたPostgreSQLにアクセスできなかった
問題の背景
NestJSで開発したアプリケーションが、ローカルのPostgreSQLデータベースに接続できない問題が発生しました。Docker上に立ち上げたPostgreSQLコンテナと通信できなかったことが原因です。この問題を解決するために、環境設定の見直しと正しい接続設定を行いました。
原因
問題の主な原因は以下の点です:
- データベース名、ユーザー名、パスワードの不一致:設定ファイルと実際にDockerコンテナで設定した値が一致していませんでした。
- ポート番号の不一致:Dockerコンテナのポートと、NestJSアプリケーションが使用するポートが異なっていました。
解決策
-
.envファイルの確認:まず、NestJSアプリケーションで使用するデータベースの接続情報を正しく
.env
ファイルで設定しました。 -
Docker Composeファイルの設定:Docker Composeで立ち上げたPostgreSQLコンテナの環境変数を確認し、データベース名、ユーザー名、パスワードを正しく設定しました。また、コンテナのポートとローカルのポートを一致させました。
以下が最終的に問題なく動作する設定です。
1. NestJSアプリケーションの設定
まず、NestJSで使用するtypeormConfig
を以下のように設定しました:
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { config } from 'dotenv';
import { join } from 'path';
import { TaskEntity } from 'src/task';
config({ path: '.env' });
export const typeormConfig: TypeOrmModuleOptions = {
type: 'postgres',
host: 'localhost',
port: 5432,
database: 'demo',
username: 'root',
password: 'root',
schema: 'public',
entities: [TaskEntity],
synchronize: true,
logging: true,
};
-
host
:localhost
に設定。Dockerコンテナ内のPostgreSQLに接続するためには、ホストをlocalhost
とする必要があります。 -
port
:コンテナの5432ポートを使用(5432:5432
でマッピングしているため)。 -
database
、username
、password
:これらの設定は、Docker Composeファイルで設定したものと一致させる必要があります。
2. Docker Composeファイルの設定
次に、docker-compose.yml
を以下のように設定しました:
version: '3.9'
services:
db:
image: postgres:15
container_name: postgres-db
ports:
- '5432:5432'
environment:
POSTGRES_PASSWORD: root
POSTGRES_USER: root
POSTGRES_DB: demo
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
-
POSTGRES_USER
、POSTGRES_PASSWORD
、POSTGRES_DB
:これらは、NestJSアプリケーションで設定した接続情報(root
、root
、demo
)と一致させる必要があります。 -
ポートの設定:
5432:5432
とすることで、ホストの5432ポートをコンテナにマッピングし、ローカルのPostgreSQLインスタンスとして接続できるようにしました。
3. 実行
これらの設定を反映させた後、以下の手順でDockerコンテナを再起動しました。
- Docker Composeでコンテナをビルド・立ち上げます。
docker-compose up --build
- NestJSアプリケーションを起動します。
npm run start
結果
これで、NestJSアプリケーションがDockerコンテナ内のPostgreSQLデータベースに正しく接続できるようになり、エラーなく動作しました。
まとめ
NestJSアプリケーションがDocker上のPostgreSQLに接続できなかった原因は、データベース設定の不一致とポート番号の不一致にありました。設定を見直すことで、無事接続できるようになりました。このように、Docker環境でアプリケーションを動かす際は、コンテナとアプリケーションの設定が一致しているかを再確認することが重要です。
これで、NestJSとDockerを使ったPostgreSQLの接続問題が解決できました。