我有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)
如何解决以上错误?
谢谢。
答案 0 :(得分:3)
错误的原因是您的数据库无法将客户端的IP地址“ 172.17.0.4”解析回您用于帐户“ db”的主机名。如果要这样工作,则需要在Docker环境中提供可靠的向前和向后域名解析。
或者,如果您对自己的docker环境(及其使用的私有IP范围)被充分屏蔽以防止外部访问感到满意,则可以放弃将帐户限制为特定客户端地址的整个想法,并使用“%”通配符对于主机部分。如果那是您的方法,则可能还需要在数据库服务器配置中添加“ --skip-name-resolve”,以使连接不会触发无用的DNS查询和可能的延迟。
答案 1 :(得分:0)
不能完全确定docker文件的设置,但错误是:
拒绝访问用户'orthomcl'@'172.17.0.4'(使用密码:是)
因此将priv授予IP,范围(172.%)或全部
create user `orthomcl`@`%` identified by 'PAssw0rd';
GRANT ALL PRIVILEGES on `orthomcl`.* to `orthomcl`@`%`;