ENOTFOUND 错误不断出现在 docker 和 Sequelize 中

问题描述 投票:0回答:1

首先,我尽力通过其他 stackoverflow 帖子和 Google 搜索,但同样的错误不断发生。

docker run --rm  --name mysql-container -e MYSQL_ROOT_PASSWORD=password -d -p 3305:3306 mysql:latest

首先,如果我使用上面的命令运行mysql容器,它会正常运行。

CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                               NAMES
5980ecc42a28   mysql:latest   "docker-entrypoint.s…"   36 seconds ago   Up 35 seconds   33060/tcp, 0.0.0.0:3305->3306/tcp   mysql-container
  • Dockerfile
FROM node

WORKDIR /app

COPY package.json .

RUN npm install 

COPY . .

EXPOSE 80

CMD [ "node", "app.js" ]

之后,如果我像这样创建一个 Dockerfile 并构建它,它就会正常构建。

docker build -t goals-node .   

此后,当我尝试运行我构建的映像时,“ENOTFOUND”错误继续发生。

-app.js

const fs = require("fs");
const path = require("path");

const express = require("express");
const Sequelize = require("sequelize");
const bodyParser = require("body-parser");
const morgan = require("morgan");
const dotenv = require("dotenv");

dotenv.config({ path: "./env/mysql.env" });

const Goal = require("./models/goal");

const app = express();

const sequelize = new Sequelize(
  process.env.MYSQL_DATABASE,
  process.env.MYSQL_USER,
  process.env.MYSQL_ROOT_PASSWORD,
  {
    port: process.env.MYSQL_PORT,
    host: "mysql",
    dialect: "mysql",
    logging: false,
    pool: {
      max: 5,
      min: 0,
      acquire: 30000,
      idle: 10000,
    },
  }
);

- env/mysql.env

MYSQL_DATABASE=docker_test
MYSQL_ROOT_PASSWORD=itspassword // its not real password
MYSQL_PASSWORD=itspassword
MYSQL_DATA_DIR=./mysql_data
MYSQL_USER=root
MYSQL_PORT=3305

-错误

myComputer@myComputer-MacBookPro backend % docker run --name goals-backend --rm  goals-node
80 port is ready
HostNotFoundError [SequelizeHostNotFoundError]: getaddrinfo ENOTFOUND mysql
    at ConnectionManager.connect (/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:96:17)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async ConnectionManager._connect (/app/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:222:24)
    at async /app/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:174:32
    at async ConnectionManager.getConnection (/app/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:197:7)
    at async /app/node_modules/sequelize/lib/sequelize.js:305:26
    at async Sequelize.authenticate (/app/node_modules/sequelize/lib/sequelize.js:457:5)
  parent: Error: getaddrinfo ENOTFOUND mysql
      at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:118:26) {
    errno: -3008,
    code: 'ENOTFOUND',
    syscall: 'getaddrinfo',
    hostname: 'mysql',
    fatal: true
  },
  original: Error: getaddrinfo ENOTFOUND mysql
      at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:118:26) {
    errno: -3008,
    code: 'ENOTFOUND',
    syscall: 'getaddrinfo',
    hostname: 'mysql',
    fatal: true
  }
}
  • package.json
{
  "name": "backend",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "errorTest",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1",
    "dotenv": "^16.3.2",
    "morgan": "^1.10.0",
    "mysql2": "^3.7.1",
    "sequelize": "^6.35.2",
    "sequelize-cli": "^6.6.2"
  }
}

- goal.js

const Sequelize = require("sequelize");

module.exports = class Goal extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        text: {
          type: Sequelize.STRING,
        },
      },
      {
        sequelize,
        modelName: "Goals",
        tableName: "goals",
      }
    );
  }
  static associate(db) {}
};

我查看了其他文章并更改了app.js中的均衡设置,但仍然出现相同的错误。有什么问题吗?

请帮忙...

我尝试过谷歌搜索和搜索gpt,但出现了同样的问题。

docker express sequelize.js
1个回答
0
投票

您收到

ENOTFOUND
错误的原因是您的两个 Docker 容器实际上位于不同的网络上。

让其简单工作的最快(但不是最好)的方法是使用主机的网络启动它们。下面的设置应该让一切都正常工作,这始终是一个很好的起点。然后,您可以进行一点点调整,直到完全满足您的需要。 像这样启动你的数据库:

docker run --rm --name mysql-container \ --net=host \ -e MYSQL_ROOT_PASSWORD=password \ -d \ mysql:latest

这将启动 MySQL 容器。由于它位于主机网络上,因此可以通过端口 3306 访问数据库。

更新环境文件:

MYSQL_DATABASE=mysql MYSQL_ROOT_PASSWORD=password MYSQL_PASSWORD=password MYSQL_DATA_DIR=./mysql_data MYSQL_USER=root MYSQL_PORT=3306

我们使用(默认)
mysql

数据库。当您在服务器上创建另一个数据库时,您可以在此处指定。端口也改成3306了。

这是更新的应用程序:

const fs = require("fs"); const path = require("path"); const express = require("express"); const Sequelize = require("sequelize"); const bodyParser = require("body-parser"); const morgan = require("morgan"); const dotenv = require("dotenv"); dotenv.config({ path: "./env/mysql.env" }); // const Goal = require("./models/goal"); const app = express(); const sequelize = new Sequelize( process.env.MYSQL_DATABASE, process.env.MYSQL_USER, process.env.MYSQL_ROOT_PASSWORD, { port: process.env.MYSQL_PORT, host: "127.0.0.1", dialect: "mysql", logging: false, pool: { max: 5, min: 0, acquire: 30000, idle: 10000, }, } ); sequelize.authenticate();

我已将 
host

更新为

"127.0.0.1"
,以便它连接到本地主机(这正是我们想要的,因为我们正在使用主机网络)。
我添加了 

package.json

以及所需的包。

{
  "name": "test",
  "private": true,
  "version": "1.0.0",
  "dependencies": {
          "dotenv": "*",
          "express": "*",
          "morgan": "*",
          "mysql2": "*",
          "sequelize": "*"
  },
  "devDependencies": {
  },
  "main": "n/a",
  "scripts": {
  }
}

构建并运行。

docker build -t goals-node . docker run --net=host --name goals-backend --rm goals-node

此容器也使用主机网络运行,因此它能够连接到 MySQL 容器。

🚨 一旦你完成了这项工作,我建议你的下一步是使用 Docker Compose。这是处理多个容器之间通信的更稳健的方式。

希望这有帮助。请随时发表评论或问题,我会相应更新。

© www.soinside.com 2019 - 2024. All rights reserved.