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

GitLab CI中修改MySQL服务容器my.cnf适配PHP7.3与MySQL8.4

问题背景

我用GitLab CI给连接数据库的PHP应用做单元测试,采用测试矩阵覆盖所有支持的PHP版本与数据库引擎组合,近期新增了MySQL 8.4到测试体系。但PHP 7.3无法与MySQL 8.4直接兼容,需在my.cnf中添加mysql_native_password=ON配置。(我清楚很少有人会将如此老旧的PHP版本与全新MySQL版本搭配,但测试矩阵不会区分这种情况。)

当前的.gitlab-ci配置:

test-php:
  stage: test
  parallel:
    matrix:
      - PHPVERSION: ["7.3"]
        DBSERVICE: ["mysql:8.4"]
  image: php:$PHPVERSION
  services: 
    - $DBSERVICE
  before_script:
    - ./setup-mysql.sh

配套的setup-mysql.sh脚本,用于数据库初始化及安装PHP的mysqli扩展:

docker-php-ext-install mysqli > /dev/null
docker-php-ext-enable mysqli

if [ "$PHPVERSION" = "7.3" -a "$DBSERVICE" = "mysql:8.4" ]; then
  # PHP 7.3不支持caching_sha2_password认证
  export DEBIAN_FRONTEND="noninteractive"
  apt-get -qq update && apt-get -qqy install mariadb-client
  mysql -u root -p"$MYSQL_ROOT_PASSWORD" -h mysql \
    -e "ALTER USER '$MYSQL_USER'@'%'
        IDENTIFIED WITH mysql_native_password BY '$MYSQL_PASSWORD'"
fi

我原本想在脚本中添加以下操作,但明确这无法生效——因为脚本运行在主容器而非MySQL服务容器:

cat > /etc/mysql/conf.d/enable-mysql-native-password.cnf <<EOF
[mysqld]
mysql_native_password=ON
EOF

service mysql restart

请问在仍使用标准MySQL镜像作为服务容器的前提下,是否有办法实现这一需求?


解决方案

在GitLab CI中,无需进入MySQL服务容器修改配置文件,通过服务参数或环境变量即可直接传递配置:

方法1:通过服务的command参数指定启动配置

修改.gitlab-ci.yml的services配置,针对PHP 7.3+MySQL 8.4的组合,给MySQL服务添加启动命令,直接启用mysql_native_password:

test-php:
  stage: test
  parallel:
    matrix:
      - PHPVERSION: ["7.3"]
        DBSERVICE: ["mysql:8.4"]
        MYSQL_COMMAND: ["--mysql-native-password=ON"]
  image: php:$PHPVERSION
  services: 
    - name: $DBSERVICE
      command: $MYSQL_COMMAND
  before_script:
    - ./setup-mysql.sh

这种方式让MySQL容器启动时直接加载指定参数,仅对目标矩阵组合生效。

方法2:利用MySQL官方镜像的环境变量(更简洁)

标准MySQL镜像支持通过MYSQL_INITDB_ARGS环境变量传递启动参数给mysqld,直接在services中添加环境变量即可:

test-php:
  stage: test
  parallel:
    matrix:
      - PHPVERSION: ["7.3"]
        DBSERVICE: ["mysql:8.4"]
        MYSQL_INIT_ARGS: "--mysql-native-password=ON"
  image: php:$PHPVERSION
  services: 
    - name: $DBSERVICE
      variables:
        MYSQL_INITDB_ARGS: $MYSQL_INIT_ARGS
        # 保留你原有MySQL环境变量
        MYSQL_ROOT_PASSWORD: your_root_pass
        MYSQL_USER: your_user
        MYSQL_PASSWORD: your_pass
        MYSQL_DATABASE: your_db
  before_script:
    - ./setup-mysql.sh

该方式符合官方镜像设计逻辑,无需额外修改脚本,启动时自动应用配置。

补充说明

  • 两种方法都不需要修改setup-mysql.sh脚本,你可以保留原有ALTER USER操作作为双重保险,也可在确认参数生效后移除该逻辑——因为mysql_native_password=ON会将默认认证插件切换为原生密码认证,新创建的用户会自动使用该插件。
  • 测试矩阵仅会在PHP 7.3+MySQL 8.4的组合中加载该配置,其他组合不受影响,完美适配测试需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:14:55