ER_HOST_NOT_PRIVILEGED – docker容器无法连接到mariadb

我试图让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实际上正在运行,但是不能让其他服务连接:

这些是我查过的一些步骤。 正如你所看到的,我可以login到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组中,怀疑与连接失败有关。( 参考 )

您收到的错误是由MariaDB认为您无权连接到服务器的事实引起的。 这意味着您还没有为Node.js应用程序创build数据库用户,或者该用户的权限不正确。

解决这个问题的一个傻瓜式的方法是为Node.js应用程序创build一个单独的用户。 您可以通过将以下SQL写入文件并将卷挂载到/docker-entrypoint-initdb.d来自动执行此/docker-entrypoint-initdb.d

 CREATE USER 'my-app-user'@'%' IDENTIFIED BY 'my-app-password'; GRANT ALL ON *.* TO 'my-app-user'@'%'; 

相应地更改用户名和密码,并从ALL权限中减less给定的权限。 您还可以将通配符主机名%更改为特定的IP地址或主机名。