Dockerの中にPostgres+Sequelize+Express+Next.JSの構築


はじめに

この記事は、Dockerの中のExpressにSequelizeを使ってPostgresを接続する記事である。
調べても、記事ごとに構築の仕方の差が激しかったので、自分にとってやりやすいやり方を編み出し、まとめる。

注意

これはメモ
基本的な解説はしない。DBとExpressのコネクションについてがメイン
Dockerについて全く理解していないので、ディレクトリ構造やDockerfileの書き方がよくないかもしれない。

環境

  • Docker
  • Node.js
  • Express
  • PostgreSQL
  • Next.js(APIでやり取りするのでサーバー立てて終わり)

ディレクトリ構造

product-docker-express-Dockerfile//マウント用
              -next-Dockerfile//マウント用
       -express //expressを直接インストール
       -next //Nextを直接インストール
       -docker-compose

product/expressにsequelizeをインストール

npm install --save sequelize pg sequelize-cli

Docker-composeでの設定

docker-compose
version: '3'
services:

  backend:
    build:
      context: ./docker/express
      dockerfile: Dockerfile
    image: back
    container_name: back
    ports:
      - 3000:3000
    environment:
      DATABASE_URL: postgres://postgres:postgres@db:5432/postgres 
    volumes:
      - ./express:/src
    command: [sh, -c, npm install && npm start]

  frontend:
    build: 
      context: ./docker/next 
      dockerfile: Dockerfile
    image: front
    container_name: front
    ports:
      - 3001:3000
    volumes: 
      - ./next:/src
    command: [sh, -c, npm install && npm run dev]

  db:
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"

ここで重要なのは、DATABASE_URLである。
のちに、sequelizeのconfig.jsonにて環境変数として使用するため設定している。
postgres://postgres:postgres@db:5432/postgres
このURLは、
postgres://username:password@host:port/dbname
となっており、docker-composeで設定した通りに当てはめていく。
dbnameは、postgres-Docker Hubによると、POSTGRES_DBの記述がなければ、POSTGRES_USERの値が代わりに使用される。

Sequelize

cliをインストールしたことによって、RailsのActiveRecordのように、modelやmigrationを生成することができる。

$ sequelize init
//modelやmigration、configなどのフォルダーを生成。

やりたいひとはやろうなテスト

$ docker-compose up -d
$ docker-compose run backend npx sequelize model:create --name Test //モデルとマイグレーションファイルを生成
$ docker-compose run backend npx sequelize db:migrate --env development 

まだ、エラーがでるはず...

config/config.jsonの設定

 "development": {
    "dialect": "postgres",
    "use_env_variable":"DATABASE_URL"
  }

dialectはDBの種類
use_env_variableは環境変数を参照する。つまり、dockercomposeで設定したURLが参照されている。

そして記事内の「やりたいひとはやろうなテスト」を行うと...

マイグレーションが反映される。

まとめ

なにが正解かわからないが、他の記事などを見るとSQLスクリプトを書いていたり、自分でmodelを書いていたりしていたので調べるのが大変だった。
一番最初の環境構築でつまづいた初心者がまとめたものなので参考にならないかも。
なにかあれば...twitter@izszzz_