できること
nest js, primsa, mysql をdockerで構築する
手順
- nest をローカル環境に入れる
- dockerfile, docker-composeを作成
- prismaを入れる
完成コード
- dockerfile
FROM node:18 as base WORKDIR /app # * で lockもか COPY package*.json ./ RUN npm i COPY . . RUN npm run build FROM base as dev WORKDIR /app COPY package*.json ./ RUN npm install CMD ["npm", "run", "start:dev"]
- docker-compose
version: '3' services: backend: build: context: . volumes: - ./:/app ports: - 3001:3001 depends_on: - mysql networks: - backend mysql: image: mysql:8.0.27 platform: linux/amd64 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: mysql MYSQL_DATABASE: todo_app_db MYSQL_USER: user MYSQL_PASSWORD: password restart: always networks: - backend networks: backend:
詰まったこと
- docker-composeで nestjs と mysqlを接続するときに、networkを設定しないといけない
これは、下記で作成する場合、デフォルトではコンテナごとに別のネットワークを構築するらしい
version: '3' services: backend: build: context: . volumes: - ./:/app ports: - 3001:3001 depends_on: - mysql mysql: image: mysql:8.0.27 platform: linux/amd64 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: mysql MYSQL_DATABASE: todo_app_db MYSQL_USER: user MYSQL_PASSWORD: password restart: always
なので下記のように networkを作成する必要がある
version: '3' services: backend: build: context: . volumes: - ./:/app ports: - 3001:3001 depends_on: - mysql networks: - backend mysql: image: mysql:8.0.27 platform: linux/amd64 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: mysql MYSQL_DATABASE: todo_app_db MYSQL_USER: user MYSQL_PASSWORD: password restart: always networks: - backend networks: backend:
下記の様にすべての権限をユーザーにあげないと、 migrateできなかった
grant all CREATE, ALTER, DROP, REFERENCES ON *.* to prisma_user@localhost;
下記のprisma様に設定した様に、docker-compose で設定した様に、 mysqlになるみたい
DBだけ docker化した場合はhost はlocalhostだった
DATABASE_URL="mysql://user:password@mysql:3306/todo_app_db?schema=public"
- コンテナ内のdb接続
## 接続 docker-compose exec mysql bash mysql -u root -p ※ MYSQL_ROOT_PASSWORDの内容で入る ## 権限状態を確認 SHOW GRANTS FOR 'user'@'%' ;
m1はこういうのがちょこちょこあるよね
mysql: image: mysql:8.0.27 platform: linux/amd64 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: mysql MYSQL_DATABASE: todo_app_db MYSQL_USER: user MYSQL_PASSWORD: password restart: always networks: - backend
参考サイト
- nest js docker化
- nest jsにprismaを入れる
- primsa migrateの権限エラー対応