GitLab CI/CD流水线中MariaDB数据库容器启动失败如何解决?
GitLab CI MariaDB服务启动失败问题修复
问题根源
- MariaDB服务容器缺少必要环境变量:MariaDB官方镜像启动时必须指定
MYSQL_ROOT_PASSWORD,否则会触发配置检查失败,容器无法启动,进而出现"Cannot link to a non running container"错误。 - Job镜像选型错误:
db:install任务使用mariadb服务器镜像作为运行环境,完全没必要,应使用仅含mysql客户端的镜像执行连接测试。 - 数据库连接参数错误:mysql命令中的host参数写成了
jdbc:mysql://localhost,GitLab CI中Job容器需通过服务别名(如db)访问服务容器,且不需要JDBC前缀。 - Flyway迁移参数错误:
db:migrate任务未指定数据库连接地址,且-Dflyway.user错误地设置为密码而非用户名。
具体修复步骤
1. 修正基础数据库Job模板
将.db-job的镜像换成轻量的mysql客户端镜像,同时修正连接命令:
.db-job: image: mysql:${MARIA_DB_IMAGE_VERSION} script: - echo "SELECT 'OK';" | mysql --user=root --password="$DATABASE_PASSWORD" --host="db" "$DATABASE_SCHEMA"
2. 修复db:install任务的服务配置
给MariaDB服务添加必要的环境变量,同时确保执行数据库连接测试:
db:install: stage: db extends: .db-job services: - name: mariadb:${MARIA_DB_IMAGE_VERSION} alias: db variables: MYSQL_ROOT_PASSWORD: "$DATABASE_PASSWORD" MYSQL_DATABASE: "$DATABASE_SCHEMA" needs: [] script: - cd "$BACKEND_DIR" - pwd # 执行数据库连通性测试 - echo "SELECT 'OK';" | mysql --user=root --password="$DATABASE_PASSWORD" --host="db" "$DATABASE_SCHEMA" cache: policy: pull-push
3. 修正db:migrate任务的Flyway配置
添加MariaDB服务依赖,修正Flyway的连接参数:
db:migrate: stage: db extends: .maven-job services: - name: mariadb:${MARIA_DB_IMAGE_VERSION} alias: db variables: MYSQL_ROOT_PASSWORD: "$DATABASE_PASSWORD" MYSQL_DATABASE: "$DATABASE_SCHEMA" script: - cd "$BACKEND_DIR" - pwd - mvn --version # 修正Flyway连接参数,指定完整JDBC地址、用户名和密码 - mvn -Dflyway.url="jdbc:mysql://db:3306/$DATABASE_SCHEMA" -Dflyway.user=root -Dflyway.password="$DATABASE_PASSWORD" -Dflyway.schemas="$DATABASE_SCHEMA" flyway:migrate cache: policy: pull-push needs: ["db:install"]
额外注意事项
- 确保流水线变量
MARIA_DB_IMAGE_VERSION、DATABASE_PASSWORD、DATABASE_SCHEMA已在GitLab项目中正确配置。 - 若多个任务都需要访问MariaDB,可将服务配置移到全局
services中,避免重复配置。 - MariaDB服务容器启动需要一定时间,若遇到连接超时,可在Job脚本中添加等待逻辑:
until mysql --host=db --user=root --password="$DATABASE_PASSWORD" -e "SELECT 1"; do sleep 2; done
内容的提问来源于stack exchange,提问作者Sam Fisher
相关产品推荐
相关产品推荐

