连接到 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')
});