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
相关产品推荐
相关产品推荐

