首先,我尽力通过其他 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
FROM node
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 80
CMD [ "node", "app.js" ]
之后,如果我像这样创建一个 Dockerfile 并构建它,它就会正常构建。
docker build -t goals-node .
此后,当我尝试运行我构建的映像时,“ENOTFOUND”错误继续发生。
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,
},
}
);
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
}
}
{
"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"
}
}
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,但出现了同样的问题。
您收到
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。这是处理多个容器之间通信的更稳健的方式。
希望这有帮助。请随时发表评论或问题,我会相应更新。