ER_HOST_NOT_PRIVILEGED - docker容器无法连接到mariadb

3

我正在尝试将一个docker容器与mariadb和node.js镜像配合使用。该容器将使用现有的数据库在/home/mysql中。然而,当容器启动时,我在node.js中遇到了"连接失败"的错误:

Error: ER_HOST_NOT_PRIVILEGED: 
Host '172.18.0.5' is not allowed to connect to this MariaDB server

这是我的docker-compose.yml文件:
version: '3'
services:
  mariadb:
    image: mariadb
    restart: always
    volumes:
     - /home/mysql:/var/lib/mysql
    user: "mysql"
    ports:
      - "3306:3306"
  watch:
    build: .
    restart: always
    links:
      - mariadb:mysql
    environment:
      - DOCKER_IP=172.18.0.2
    depends_on: ['mariadb']
    ports:
      - "3000:3000"

阅读了这个线程后,我发现mysql实际上正在运行,但它无法让其他服务连接:
以下是我已经检查过的一些步骤。正如您所看到的,我可以登录到mysql实例中:
    $ docker exec -it 552aae9ea09c bash

    mysql@552aae9ea09c:/$ mysql -u root -p
    Enter password: *******

    MariaDB [(none)]> SELECT host, user FROM mysql.user;
    +-------------+------------------+
    | host        | user             |
    +-------------+------------------+
    | 127.0.0.1   | root             |
    | ::1         | root             |
    | someusername|                  |
    | someusername| root             |
    | localhost   |                  |
    | localhost   | dbusername       |
    | localhost   | databasename     |
    | localhost   | root             |
    +-------------+------------------+
    8 rows in set (0.00 sec)


mysql@552aae9ea09c:/$ mysqld --verbose --help | grep bind-address

2017-11-13 17:35:40 139825857279872 [Note] Plugin 'FEEDBACK' is disabled.
  --bind-address=name IP address to bind to.

bind-address                                       (No default value)

需要注意的一点是,尽管在yml文件中明确将用户设置为mysql,但在/home/mysql目录下的这三个文件:ib_logfile0ib_logfile1ib_buffer_pool仍然属于systemd-journal-remote组,我怀疑这与连接失败有关。(参考

3个回答

9
您收到的错误是由于MariaDB认为您未被授权连接到服务器。这意味着您尚未为Node.js应用程序创建数据库用户,或者该用户的授权不正确。
解决此问题的一种可靠方法是为Node.js应用程序创建单独的用户。您可以通过将以下SQL编写到文件中并将卷挂载到/docker-entrypoint-initdb.d来自动化此过程。
CREATE USER 'my-app-user'@'%' IDENTIFIED BY 'my-app-password';
GRANT ALL ON *.* TO 'my-app-user'@'%';

请根据实际情况修改用户名和密码,并将赋予的权限从ALL减少。您还可以将通配符主机名%更改为特定的IP地址或主机名。


我有类似的问题,但是问题仍然存在。有几个用户的主机是“%”或者“172.16.254.0/255.255.255.0”(第二个选项限制允许的IP地址为我的子网)。 ER_HOST_NOT_PRIVILEGED:主机'172.16.254.6'不被允许连接到此MySQL服务器。你有什么其他的想法吗? - Gleichmut

1

只需运行此 SQL 查询:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password'

(假设您正在以root用户身份连接)

0
问题是错误的mysql模块...
  npm uninstall mysql
  npm install mysql2

然后在您的代码中正常使用它:
var mysql = require('mysql2');
    
var con = mysql.createConnection({
 host: "localhost",
 user: "root",
 password: "password"
});
    
con.connect(function(err) {
 if (err) throw err;
 console.log("Connected!");
});

祝一切顺利。
注意:只需将mysql更改为mysql2。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接