mysql - DBI 连接 ('database=orthomcl;host=db;mysql_local_infile=1' ,'orthomcl' ,...) 失败 : Access denied for user

标签 mysql perl docker docker-compose mariadb

我有cat orthomcl/Dockerfile:

FROM debian:stretch-backports

RUN apt-get update  && apt-get install -y --no-install-recommends \
        wget \
        cpanminus \
        build-essential \
        default-libmysqlclient-dev \
        python \
        ca-certificates \
        && rm -rf /var/lib/apt/lists/*

RUN cpanm DBI DBD::mysql

这是我的docker-compose.yml:

orthomcl:
    tty: true
    build: orthomcl
    restart: always
    links:
        - db
    volumes:
        - ./output_dir/:/output_dir

db:
  image: mariadb
  restart: always
  environment:
    - MYSQL_ROOT_PASSWORD="PAssw0rd"
    - MYSQL_DATABASE="orthomcl"
    - MYSQL_USER="orthomcl"
    - MYSQL_PASSWORD="PAssw0rd"
  ports:
    - "3306:3306"
  volumes:
    - ./mysql/:/docker-entrypoint-initdb.d

这是 SQL 配置文件:

$ cat mysql/orthomcl.sql 
CREATE DATABASE IF NOT EXISTS `orthomcl`;
create user `orthomcl`@`db` identified by 'PAssw0rd';
GRANT ALL PRIVILEGES on `orthomcl`.* to `orthomcl`@`db`;

连接数据库的Perl脚本是output_dir/test.pl

#!/bin/env perl  
use DBI;
require DBD::mysql;

my $dbConnectString="DBI:mysql:database=orthomcl;host=db;mysql_local_infile=1";
my $dbLogin="orthomcl";
my $dbPassword="PAssw0rd";

DBI->connect($dbConnectString, $dbLogin, $dbPassword, { RaiseError => 1 } ) or
die ( "Couldn't connect to database: " . DBI->errstr );

接下来,我使用了 docker-compose up,然后我做了:

$ docker-compose run orthomcl perl /output_dir/test.pl
Starting orthomcl_db_1 ... done
DBI connect('database=orthomcl;host=db;mysql_local_infile=1','orthomcl',...) failed: Access denied for user 'orthomcl'@'172.17.0.4' (using password: YES) at /output_dir/test.pl line 10.

MySQL 日志显示:

...
db_1        | 2019-05-04  4:56:31 0 [Note] mysqld: ready for connections.
db_1        | Version: '10.3.14-MariaDB-1:10.3.14+maria~bionic'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
db_1        | 2019-05-04  4:58:19 8 [Warning] Access denied for user 'orthomcl'@'172.17.0.4' (using password: YES)

如何解决上述错误?

提前谢谢你。

最佳答案

错误的原因是您的数据库无法将客户端的 IP 地址“172.17.0.4”解析回您用于帐户的主机名“db”。如果你想像这样工作,你需要在你的 docker 环境中提供强大的正向和反向域名解析。

或者,如果您对您的 docker 环境(及其使用的私有(private) IP 范围)已充分屏蔽外部访问感到满意,您可以放弃将帐户限制为特定客户端地址的整个想法,并使用“%”通配符对于主机部分。如果这是您的方法,您可能还想将“--skip-name-resolve”添加到您的数据库服务器配置中,这样连接就不会触发无用的 DNS 查询和可能的延迟。

关于mysql - DBI 连接 ('database=orthomcl;host=db;mysql_local_infile=1' ,'orthomcl' ,...) 失败 : Access denied for user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55979641/

相关文章:

php - 在 PHP 中使用带有条件测试的查询

php - 将月拆分为周并使用 GROUP BY

xml - 使用 XML::Twig 解析文件句柄

linux - Perl 在解析和打印文件段时正在更改和消除声明的变量?可能的错误?

spring - docker 运行-错误:无法访问jarfile

image - 如何在 docker-compose 3 中使用 docker deploy?

mysql - 查询多个表的总和

php - 包括 Google map ,以便我可以通过管理中心动态更改位置

perl - 为什么在启用自动刷新后使用空打印?

docker buildx "exec user process caused: exec format error"