You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下Drupal执行Drush命令遇MySQL 1045权限错误求助

Drupal Drush 数据库访问被拒问题排查与解决

问题背景

使用Ubuntu系统修复Drupal项目yaml文件后,删除容器并重启docker-compose,容器运行正常、端口配置无误,且可通过sudo正常登录MySQL,但执行Drush命令时抛出以下错误:

SQLSTATE[HY000] [1045] Access denied for user 'user1'@'172.23.0.2' (using password: YES)

补充信息

  • 修改settings.php中的用户名或移除密码后,错误依旧;
  • 尝试在MySQL中创建用户并授予权限,无效果;
  • 怀疑Drush无法识别Docker分配的IP。

相关配置文件

docker-compose.yml

theme:
  image: docwebsolutions/doc_drupal:php8.1-v3
  volumes:
    - ~/Users/USER/web_theme:/var/www/docker_platform:delegated
 #   - /path/to/.ssh:/root/.ssh:ro  
  entrypoint: /root/entrypoint.sh --dbusername=user1 --dbpassword=admin --dbname=db1 --dbhost=db --dbport=3306 --project=web_theme --sitemail=admin@example.com --accountmail=admin@example.com --adminpassword=admin --drupalversion=9 --mariadbpassword=admin
  ports:
    - 443
    - 80
  depends_on:
    - db
  links:
    - db

#############################################################
##  External Services                                      ##
#############################################################
db:
  image: mariadb
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: admin1
portainer:
  image: portainer/portainer
  ports:
    - 9000
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  command: -H unix:///var/run/docker.sock --no-auth

settings.php

$databases['default']['default'] = array (
  'database' => 'db1',
  'username' => 'user1',
  'password' => 'admin',
  'prefix' => '',
  'host' => 'db',
  'port' => '3306',
   'namespace' => 'Drupal\Core\Database\Driver\mysql',
  'driver' => 'mysql',
 'autoload' => 'core/modules/mysql/src/Driver/Database/mysql/',
);

解决步骤

1. 修正数据库用户权限范围

错误提示中的user1@172.23.0.2说明用户从Docker网段的IP发起访问,若之前只授权了user1@localhost或特定IP,会导致权限拒绝。

进入MariaDB容器执行权限配置:

docker exec -it [db容器名] mysql -u root -padmin1

在MySQL命令行中执行:

CREATE USER IF NOT EXISTS 'user1'@'%' IDENTIFIED BY 'admin';
GRANT ALL PRIVILEGES ON db1.* TO 'user1'@'%';
FLUSH PRIVILEGES;

%表示允许从任意主机访问,也可指定Docker网段(如172.23.%)提升安全性。

2. 检查entrypoint脚本是否覆盖settings.php

你的entrypoint脚本传入了数据库参数,部分Drupal镜像的entrypoint会自动生成或覆盖settings.php,导致手动修改的配置不生效。

进入theme容器查看当前生效的配置文件:

docker exec -it [theme容器名] cat /var/www/docker_platform/sites/default/settings.php

若内容与本地文件不一致,可采取以下方案:

  • 调整entrypoint的参数,确保数据库用户名密码与预期一致;
  • 在volumes中添加本地settings.php的挂载规则,覆盖容器内生成的文件;
  • 修改entrypoint脚本,使其跳过对已有settings.php的覆盖。

3. 验证容器间数据库连通性

在theme容器内直接用mysql命令测试连接,确认容器间网络是否正常:

docker exec -it [theme容器名] mysql -u user1 -padmin -h db -P 3306 db1

若连接失败,排查Docker网络配置;若连接成功,则问题出在Drush的缓存或环境配置上。

4. 清除Drush配置缓存

Drush可能缓存了旧的数据库配置,执行以下命令清除缓存并验证连接:

docker exec -it [theme容器名] drush cr
docker exec -it [theme容器名] drush sql:connect

drush sql:connect会输出当前使用的数据库连接字符串,确认是否与settings.php配置一致。

5. 重置Docker网络配置

若容器间无法通过服务名db访问,可重置Docker Compose网络:

# 若需保留数据库数据,去掉 -v 参数
docker-compose down -v
docker-compose up -d

重启后检查theme容器的hosts文件,确认db的映射条目存在:

docker exec -it [theme容器名] cat /etc/hosts

内容的提问来源于stack exchange,提问作者yogurtexpress

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:38:25