実現したいこと
docker-composeでデータベースとAPIコンテナの接続をしたい
前提
API:Node.js
DB:MySQL
docker-compose.yml内でenvironmentについて記述をし、
APIコンテナからSequelizeを用いて接続を試みています。
ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:3306というエラーが一向に解決しません。
DBコンテナにexecで入ってMySQLへのログインはできています。
コンテナが起動しているかももちろん確認しています。
MySQLを起動していないのではという記事が多かったのですが改めて確認しても問題なさそうです。
また,MySQLのバージョン8からの認証の仕様が変更されたためエラーが出るとの記述も見ましたが、5.7で実行しているので関係なさそうです。
発生している問題・エラーメッセージ
todo-api | サーバーが5001番で起動しました。 todo-api | Unable to connect to the database: ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:3306 todo-api | at ConnectionManager.connect (/home/node/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:92:17) todo-api | at process.processTicksAndRejections (node:internal/process/task_queues:95:5) todo-api | at async ConnectionManager._connect (/home/node/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:220:24) todo-api | at async /home/node/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:174:32 todo-api | at async ConnectionManager.getConnection (/home/node/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:197:7) todo-api | at async /home/node/node_modules/sequelize/lib/sequelize.js:304:26 todo-api | at async Sequelize.authenticate (/home/node/node_modules/sequelize/lib/sequelize.js:456:5) todo-api | at async a (/home/node/app.js:38:5) { todo-api | parent: Error: connect ECONNREFUSED 127.0.0.1:3306 todo-api | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) { todo-api | errno: -111, todo-api | code: 'ECONNREFUSED', todo-api | syscall: 'connect', todo-api | address: '127.0.0.1', todo-api | port: 3306, todo-api | fatal: true todo-api | }, todo-api | original: Error: connect ECONNREFUSED 127.0.0.1:3306 todo-api | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) { todo-api | errno: -111, todo-api | code: 'ECONNREFUSED', todo-api | syscall: 'connect', todo-api | address: '127.0.0.1', todo-api | port: 3306, todo-api | fatal: true todo-api | } todo-api | }
該当のソースコード
yml
1version: "3" 2 3services: 4 app: 5 build: ./ 6 container_name: todo-app 7 tty: true 8 ports: 9 - 3000:3000 10 volumes: 11 - ./front:/home/node 12 networks: 13 - todoapp-network 14 # command: "npm start" 15 depends_on: 16 - api 17 api: 18 build: ./ 19 container_name: todo-api 20 environment: 21 DB_HOST: db 22 DB_USER: todo 23 DB_PASS: todo 24 DB_DATABASE: todo 25 DEBUG: todoapi:server 26 tty: true 27 ports: 28 - 5001:5001 29 volumes: 30 - ./api:/home/node 31 networks: 32 - todoapp-network 33 command: "npm run dev" 34 depends_on: 35 - db 36 37 db: 38 image: mysql:5.7 39 platform: linux/amd64 40 container_name: mysql 41 restart: always 42 environment: 43 MYSQL_ROOT_HOST: todo-api 44 MYSQL_ROOT_PASSWORD: ${DB_PASS} 45 MYSQL_DATABASE: todo 46 MYSQL_USER: todo 47 MYSQL_PASSWORD: todo 48 ports: 49 - 3306:3306 50 volumes: 51 - ./db/docker/data:/var/lib/mysql 52 networks: 53 - todoapp-network 54 55 adminer: 56 image: adminer 57 restart: always 58 ports: 59 - 8080:8080 60 networks: 61 - todoapp-network 62 63networks: 64 todoapp-network:
Dockerfile
1FROM node:18-slim 2 3WORKDIR /home/node 4USER node
JavaScript
1const express = require("express"); 2const app = express(); 3const { Sequelize } = require("sequelize"); 4const PORT = 5001; 5 6const sequelize = new Sequelize("todo", "todo", "todo", { 7 host: "127.0.0.1", 8 dialect: "mysql", 9}); 10app.use((req, res, next) => { 11 res.setHeader("Access-Control-Allow-Origin", "*"); 12 res.setHeader( 13 "Access-Control-Allow-Methods", 14 "GET, POST, PUT, PATCH, DELETE, OPTION" 15 ); 16 res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); 17 next(); 18}); 19app.listen(PORT, console.log("サーバーが" + PORT + "番で起動しました。")); 20 21const a = async () => { 22 try { 23 await sequelize.authenticate(); 24 console.log("Connection has been established successfully."); 25 } catch (error) { 26 console.error("Unable to connect to the database:", error); 27 } 28}; 29a();
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー