GitLab CI/CD部署Laravel时Docker MySQL IP访问权限问题
解决GitLab CI/CD部署Laravel时的PDO MySQL连接权限问题
这个问题很典型——你的GitLab CI Runner是运行在Docker容器里的,172.17.0.4就是这个容器的内网IP,而你的MySQL服务器绑定在主机IP 172.0.0.1上,当前MySQL的用户权限只允许从特定IP(比如本地)访问,所以才会抛出权限拒绝的错误。下面给你几个实用的解决方案:
方案1:给MySQL用户授权Runner容器所在的IP/子网
这是最直接的办法。登录到你的MySQL服务器,执行以下SQL命令,允许你的数据库用户从Runner的容器IP访问:
-- 针对单个IP授权 GRANT ALL PRIVILEGES ON your_laravel_db.* TO 'user'@'172.17.0.4' IDENTIFIED BY 'your_db_password'; FLUSH PRIVILEGES;
如果担心Runner容器重启后IP变化(Docker默认的桥接网络IP可能变动),可以直接授权整个子网:
-- 授权172.17.0.0/24子网内的所有IP GRANT ALL PRIVILEGES ON your_laravel_db.* TO 'user'@'172.17.0.%' IDENTIFIED BY 'your_db_password'; FLUSH PRIVILEGES;
执行完后可以用SELECT user, host FROM mysql.user;确认用户的host配置是否生效。
方案2:将GitLab Runner切换为Host网络模式
如果你的MySQL服务器和GitLab Runner在同一台物理/虚拟主机上,可以让Runner容器直接使用主机的网络栈,这样连接MySQL时用127.0.0.1或者172.0.0.1都能正常访问。
- 编辑GitLab Runner的配置文件,路径通常是
/etc/gitlab-runner/config.toml - 找到你的Runner配置块,添加
network_mode = "host":
[[runners]] name = "Your Laravel Runner" url = "https://your-gitlab-instance.com/" token = "your-runner-token" executor = "docker" [runners.docker] image = "php:8.2-cli" # 替换为你用的镜像 volumes = ["/cache"] network_mode = "host" # 新增这一行
- 重启GitLab Runner服务:
sudo gitlab-runner restart
这种方式不需要修改MySQL的权限,因为Runner会直接以主机身份访问MySQL。
方案3:检查MySQL的绑定地址(可选)
如果上述方案都不生效,确认你的MySQL配置文件(通常是/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf)里的bind-address设置为0.0.0.0,而不是127.0.0.1——如果绑定在127.0.0.1,MySQL只会响应本地请求,容器里的Runner就无法连接。修改后重启MySQL服务即可。
注意事项
- 生产环境尽量避免授权
user@'%'(允许所有IP访问),严格限制IP范围更安全 - 如果是云服务器,还要检查主机防火墙是否允许3306端口接收
172.17.0.0/16子网的流量
内容的提问来源于stack exchange,提问作者Albert Tjornejoj




