通过perl DBI从主机连接到容器中的mysql



我试图通过perl脚本连接到mysql在容器中运行。

容器

1063b3f15b0f   mysql:latest            "docker-entrypoint.s…"   3 days ago   Up 3 days   0.0.0.0:3306->3306/tcp, 33060/tcp   test_db

连接使用tcp协议从主机工作mysql -P 3306 --protocol=tcp -u root -p

但不确定如何在perl

中指定DBI协议
use DBI;
my $driver = "mysql";
my $host = "127.0.0.1";
my $database = "users";
my $dsn = "DBI:$driver:database=$database,host=$host";
my $userid = "root";
my $password = "testpw";
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;

失败,出现错误

DBI connect('database=users,host=127.0.0.1','root',...) failed: Access denied for user 'root'@'localhost' (using password: YES) at update_db.pl line 10.
Access denied for user 'root'@'localhost' (using password: YES) at update_db.pl line 10.
谁能帮我把它打开吗?

您不需要指定协议。事实上,你正在连接到"127.0.0.1"。(而不是"localhost")足以确保DBI将通过TCP而不是使用Unix套接字进行连接(详细信息请参阅连接传输协议)。

然而,我怀疑你的根用户没有权限从任何地方连接。如果运行以下SQL,会看到什么:

select user, host from mysql.user where user = 'root';

MySQL用户模块允许你指定用户可以从哪个主机连接。host列中的'%'将允许来自任何主机的连接。否则,您只能从某些主机连接。