无法连接到数据库:用户访问被拒绝
Can't connect to database: Access denied for user
我正在设置 CakePHP 3.7 应用程序并使用 docker 撰写。我也有一个 mysql 服务,我正在尝试连接它,但我收到此错误:Access denied for user 'ws_user'@'172.20.0.3' (using password: YES)
我像这样向用户授予权限:GRANT ALL PRIVILEGES ON mydb.* TO 'ws_user'@'%' IDENTIFIED BY '<superSecretPasswordHere>'
。
如果我使用 root 凭据,cakephp 能够很好地建立连接。
我还将端口 3030 上的 mysql 服务公开到我的本地机器,我能够很好地连接 ws_user 凭据。
我还在我的本地计算机上使用相同的凭据设置 mysql 运行,cake 也可以连接到主机 172.17.0.1
。
我很困惑可能是什么问题。这看起来确实像是一个权限问题(因为错误消息),但我能够通过命令行通过暴露的端口进行连接。我的下一个想法是,这可能是因为密码中有特殊字符,但同样,如果我在我的主机上连接到 mysql 运行,它可以使用相同的密码正常工作。
这是我的 docker-compose 文件:
version: '2'
# define all services
services:
# our service is called CakePHP ;-)
cakephp:
# we want to use the image which is build from our Dockerfile
build:
context: .
dockerfile: Dockerfile
# apache is running on port 80 but we want to expose this to port 4000 on our local machine
ports:
- "80:80"
# we are depending on the mysql backend
depends_on:
- mysql
# we mount the working dir into the container, handy for development
volumes:
- .:/var/www/html/
environment:
- SECURITY_SALT
- MYSQL_HOST
- MYSQL_USERNAME
- MYSQL_PASSWORD
mysql:
# we use the mysql base image, version 5.6.36
#image: mysql:5.6.39
build:
context: .
dockerfile: Dockerfile.mysql
ports:
- "3030:3006"
# we mount a datavolume to make sure we don't lose data
volumes:
- mysql_data:/var/lib/mysql
# setting some envvars to create the DB
environment:
- MYSQL_ROOT_PASSWORD
- MYSQL_DATABASE
volumes:
mysql_data:
您从 "cakephp" 连接到 "mysql:3306"。这应该在您的连接字符串中。
您可以从您的主机连接到“127.0.0.1:3030”以验证您的数据库是否接受远程登录。
那你应该检查凭据,它们是相同的。我建议您将它们放在一个 .env 文件中,然后通过值的 "copy-paste" 来测试连接。
您可以通过 运行:
检查实际传递给容器的值
docker-compose config
这会向您显示将发送到 docker 引擎的 docker-compose 文件的确切版本。
希望这有效,否则请给我留言。
我正在设置 CakePHP 3.7 应用程序并使用 docker 撰写。我也有一个 mysql 服务,我正在尝试连接它,但我收到此错误:Access denied for user 'ws_user'@'172.20.0.3' (using password: YES)
我像这样向用户授予权限:GRANT ALL PRIVILEGES ON mydb.* TO 'ws_user'@'%' IDENTIFIED BY '<superSecretPasswordHere>'
。
如果我使用 root 凭据,cakephp 能够很好地建立连接。
我还将端口 3030 上的 mysql 服务公开到我的本地机器,我能够很好地连接 ws_user 凭据。
我还在我的本地计算机上使用相同的凭据设置 mysql 运行,cake 也可以连接到主机 172.17.0.1
。
我很困惑可能是什么问题。这看起来确实像是一个权限问题(因为错误消息),但我能够通过命令行通过暴露的端口进行连接。我的下一个想法是,这可能是因为密码中有特殊字符,但同样,如果我在我的主机上连接到 mysql 运行,它可以使用相同的密码正常工作。
这是我的 docker-compose 文件:
version: '2'
# define all services
services:
# our service is called CakePHP ;-)
cakephp:
# we want to use the image which is build from our Dockerfile
build:
context: .
dockerfile: Dockerfile
# apache is running on port 80 but we want to expose this to port 4000 on our local machine
ports:
- "80:80"
# we are depending on the mysql backend
depends_on:
- mysql
# we mount the working dir into the container, handy for development
volumes:
- .:/var/www/html/
environment:
- SECURITY_SALT
- MYSQL_HOST
- MYSQL_USERNAME
- MYSQL_PASSWORD
mysql:
# we use the mysql base image, version 5.6.36
#image: mysql:5.6.39
build:
context: .
dockerfile: Dockerfile.mysql
ports:
- "3030:3006"
# we mount a datavolume to make sure we don't lose data
volumes:
- mysql_data:/var/lib/mysql
# setting some envvars to create the DB
environment:
- MYSQL_ROOT_PASSWORD
- MYSQL_DATABASE
volumes:
mysql_data:
您从 "cakephp" 连接到 "mysql:3306"。这应该在您的连接字符串中。
您可以从您的主机连接到“127.0.0.1:3030”以验证您的数据库是否接受远程登录。
那你应该检查凭据,它们是相同的。我建议您将它们放在一个 .env 文件中,然后通过值的 "copy-paste" 来测试连接。
您可以通过 运行:
检查实际传递给容器的值docker-compose config
这会向您显示将发送到 docker 引擎的 docker-compose 文件的确切版本。
希望这有效,否则请给我留言。