You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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都能正常访问。

  1. 编辑GitLab Runner的配置文件,路径通常是/etc/gitlab-runner/config.toml
  2. 找到你的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" # 新增这一行
  1. 重启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

火山引擎 最新活动