【问题标题】:ER_HOST_NOT_PRIVILEGED - docker container fails to connect to mariadbER_HOST_NOT_PRIVILEGED - docker 容器无法连接到 mariadb
【发布时间】:2017-11-13 17:50:19
【问题描述】:

我正在尝试让 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"

看完这个thread,发现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_logfile0,ib_logfile1,ib_buffer_pool仍然在systemd-journal-remote 的组,我怀疑与连接失败有关。(reference)

【问题讨论】:

    标签: mysql docker docker-compose mariadb


    【解决方案1】:

    您收到的错误是由于 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 地址或主机名。

    【讨论】:

      【解决方案2】:

      只需运行这个 sql 查询:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-29
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 2019-08-02
        • 2015-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多