GitLab CI配置MariaDB测试服务启动失败问题
问题根因定位
查看服务日志中的关键报错可以直接定位故障点:
mysqld: Character set 'utf8mb4 --collation-server=utf8mb4_unicode_ci' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file
MariaDB的mysqld进程收到的字符集参数是一整串未拆分的长字符串,被错误识别为--character-set-server的参数值,因此触发了启动校验失败。
配置错误说明
当前MariaDB服务配置中,command字段的写法不符合GitLab CI的参数透传规则:
原配置将两个独立的启动参数拼接为单个数组元素:
command: [ "--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci" ]
GitLab CI对服务的command配置会直接将数组元素逐一作为独立参数传递给容器入口程序,整个过程没有经过Shell的自动拆分逻辑。也就是说这种写法只会给mysqld传1个带空格的长参数,而非两个独立的启动项。
这也是本地运行正常、CI环境启动失败的核心差异:本地使用docker run传参时,Shell会自动将空格分隔的内容拆分为独立参数,和GitLab CI的参数透传逻辑完全不同。
修复方案
将两个启动参数拆分为数组中的独立元素即可,修改后的完整参考配置:
variables: MYSQL_DATABASE: backend MYSQL_USER: admin MYSQL_PASSWORD: admin test: stage: test image: maven:3.6.3-openjdk-16 services: - name: mariadb alias: db command: - "--character-set-server=utf8mb4" - "--collation-server=utf8mb4_unicode_ci"
配置注意事项
- 在GitLab CI的服务
command配置中,禁止用空格在数组元素内拼接多个参数,所有需要传给入口程序的独立参数必须单独占一个数组项 - MariaDB官方镜像会自动识别全局变量中定义的
MYSQL_DATABASE/MYSQL_USER/MYSQL_PASSWORD值完成数据库初始化,无需额外传入对应的启动参数
内容的提问来源于stack exchange,提问作者Hantsy
相关产品推荐
相关产品推荐

