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

GitLab CI/CD配置MySQL服务后无法连接的技术求助

问题描述

将PHP应用部署到AWS实例时,未配置MySQL服务前应用运行正常,但添加MariaDB服务后,无法按照GitLab文档所述通过主机名连接到该服务。

涉及配置文件

.gitlab-ci.yml

variables:
  IMAGE_NAME: dockerhub
  IMAGE_TAG: tagname

stages:
  - build
  - deploy

build_image:
  stage: build
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
    - mariadb

  variables:
    DOCKER_TLS_CERTDIR: "/certs"
    MYSQL_DATABASE: pt01db
    MYSQL_ROOT_PASSWORD: PASS
    MYSQL_HOST: mariadb

  before_script:
    - docker login -u username -p pass
    - apk update && apk add mariadb-client
    - echo "SELECT 'OK';" | mariadb --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mariadb "$MYSQL_DATABASE"

  script:
    - docker build -t $IMAGE_NAME:$IMAGE_TAG .
    - docker push $IMAGE_NAME:$IMAGE_TAG
deploy:
  stage: deploy

  before_script:
    - chmod 400 $key
    - echo "SELECT 'OK';" | mariadb --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mariadb "$MYSQL_DATABASE"

  script:
    - ssh -o StrictHostKeyChecking=no -i $key host "
      docker login -u username -p pass &&
      docker run -d -p 80:80 $IMAGE_NAME:$IMAGE_TAG"

Dockerfile

FROM php:7.4-apache

RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y default-mysql-client
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli


# Enable Apache rewrite module
RUN a2enmod rewrite

COPY . /var/www/html

# Set the working directory

EXPOSE 80

问题分析与解决方案

1. 移除Deploy阶段的无效数据库测试

Deploy阶段未声明mariadb服务,无法解析mariadb主机名,该测试完全多余(CI内的MariaDB与AWS部署无关),直接删除:

deploy:
  stage: deploy

  before_script:
    - chmod 400 $key
  script:
    - ssh -o StrictHostKeyChecking=no -i $key host "
      docker login -u username -p pass &&
      docker run -d -p 80:80 $IMAGE_NAME:$IMAGE_TAG"

2. 配置AWS实例的容器网络互通

当前部署脚本仅启动PHP容器,未启动MariaDB容器,且即使启动两个容器,默认也不在同一网络。修改脚本创建专用网络,让两个容器互通:

deploy:
  stage: deploy

  before_script:
    - chmod 400 $key
  script:
    - ssh -o StrictHostKeyChecking=no -i $key host "
      docker login -u username -p pass &&
      # 创建专用网络(已存在则忽略)
      docker network create app-network || true &&
      # 启动MariaDB容器并加入网络
      docker run -d --name mariadb --network app-network \
        -e MYSQL_DATABASE=pt01db \
        -e MYSQL_ROOT_PASSWORD=PASS \
        mariadb:latest &&
      # 启动PHP容器加入同一网络,通过容器名访问MariaDB
      docker run -d --name php-app --network app-network -p 80:80 $IMAGE_NAME:$IMAGE_TAG"

3. 修正PHP应用的数据库连接配置

确保PHP应用的数据库配置中,主机名设为mariadb(对应AWS上MariaDB容器的名称),示例代码:

<?php
$conn = mysqli_connect('mariadb', 'root', 'PASS', 'pt01db');
?>

4. 可选:持久化MariaDB数据

避免AWS实例重启后数据丢失,给MariaDB容器挂载本地卷:

docker run -d --name mariadb --network app-network \
  -v /opt/mariadb-data:/var/lib/mysql \
  -e MYSQL_DATABASE=pt01db \
  -e MYSQL_ROOT_PASSWORD=PASS \
  mariadb:latest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:05:55