连接到 docker 上的 MySQL 容器时的 NodeJS ENOTFOUND 数据库
NodeJS ENOTFOUND db when connecting to MySQL container on docker
我正在尝试使用 docker-compose 从本地主机上的 Node.js 连接到 docker 上的 MySQL 实例 运行。
Node.js 给我这个错误:ENOTFOUND db
,下面是完整的错误消息。
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
Application Name: RESTFull API - Development
Environment: development
Server is listening on port 3000
getaddrinfo ENOTFOUND db # <------------ Error here
[nodemon] app crashed - waiting for file changes before starting...
这里是 docker-compose.yml,其中包含 MySQL 和管理员服务。
## docker-compose.yml
version: '3.8'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: 'nodejs-restfull-api-development'
expose:
- 3306
volumes:
- db-config:/etc/mysql
- db-data:/var/lib/mysql
adminer:
image: adminer:latest
depends_on:
- db
environment:
ADMINER_DEFAULT_DB_DRIVER: mysql
ADMINER_DEFAULT_DB_HOST: db
ADMINER_DESIGN: nette
ADMINER_PLUGINS: tables-filter tinymce
ports:
- "8080:8080"
volumes:
db-config:
db-data:
这是我的 node.js 数据库连接配置。
const database = mysql.createConnection({
host: 'db',
user: config.get('db.user'),
password: config.get('db.password'),
database: config.get('db.database'),
port: config.get('db.port'),
connectTimeout: config.get('db.connectTimeout')
});
database.connect(err => {
if (err) {
console.log(err.message);
process.exit(1);
} else {
console.log('Connected to database');
}
});
您没有告诉我们,但我假设您的 Node 应用 运行 在主机上而不是在容器中?如果是这种情况,那么您需要向主机公开 MySQL 端口,以便它可以访问。您还需要在配置中使用 localhost
作为主机名。
通过将 docker-compose 文件的数据库部分更改为
来公开端口
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: 'nodejs-restfull-api-development'
ports:
- 3306:3306
volumes:
- db-config:/etc/mysql
- db-data:/var/lib/mysql
并将您的节点配置更改为
const database = mysql.createConnection({
host: 'localhost',
user: config.get('db.user'),
password: config.get('db.password'),
database: config.get('db.database'),
port: config.get('db.port'),
connectTimeout: config.get('db.connectTimeout')
});
我正在尝试使用 docker-compose 从本地主机上的 Node.js 连接到 docker 上的 MySQL 实例 运行。
Node.js 给我这个错误:ENOTFOUND db
,下面是完整的错误消息。
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
Application Name: RESTFull API - Development
Environment: development
Server is listening on port 3000
getaddrinfo ENOTFOUND db # <------------ Error here
[nodemon] app crashed - waiting for file changes before starting...
这里是 docker-compose.yml,其中包含 MySQL 和管理员服务。
## docker-compose.yml
version: '3.8'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: 'nodejs-restfull-api-development'
expose:
- 3306
volumes:
- db-config:/etc/mysql
- db-data:/var/lib/mysql
adminer:
image: adminer:latest
depends_on:
- db
environment:
ADMINER_DEFAULT_DB_DRIVER: mysql
ADMINER_DEFAULT_DB_HOST: db
ADMINER_DESIGN: nette
ADMINER_PLUGINS: tables-filter tinymce
ports:
- "8080:8080"
volumes:
db-config:
db-data:
这是我的 node.js 数据库连接配置。
const database = mysql.createConnection({
host: 'db',
user: config.get('db.user'),
password: config.get('db.password'),
database: config.get('db.database'),
port: config.get('db.port'),
connectTimeout: config.get('db.connectTimeout')
});
database.connect(err => {
if (err) {
console.log(err.message);
process.exit(1);
} else {
console.log('Connected to database');
}
});
您没有告诉我们,但我假设您的 Node 应用 运行 在主机上而不是在容器中?如果是这种情况,那么您需要向主机公开 MySQL 端口,以便它可以访问。您还需要在配置中使用 localhost
作为主机名。
通过将 docker-compose 文件的数据库部分更改为
来公开端口 db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: 'nodejs-restfull-api-development'
ports:
- 3306:3306
volumes:
- db-config:/etc/mysql
- db-data:/var/lib/mysql
并将您的节点配置更改为
const database = mysql.createConnection({
host: 'localhost',
user: config.get('db.user'),
password: config.get('db.password'),
database: config.get('db.database'),
port: config.get('db.port'),
connectTimeout: config.get('db.connectTimeout')
});