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

