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

基于本地GitLab Runner的Laravel Docker Compose CI/CD部署方案咨询

Laravel项目GitLab CI/CD自动化部署流程优化咨询

我正在开发一个通过docker-compose部署php-fpm和nginx容器的Laravel项目,目标是借助GitLab CI/CD实现构建与部署自动化。已在Debian 12本地机器上安装了shell类型的GitLab Runner,尝试通过Runner执行构建、测试、部署阶段,将项目部署至另一台容器宿主机。目前已推进到docker compose up环节,不确定当前流程是否正确。

当前gitlab-ci.yml配置如下:

stages:
  - build_dependencies
  - test
  - deploy_production

cache:
  paths:
    - vendor/

build_composer:
  stage: build_dependencies
  script:
    - composer install -n
  artifacts:
    paths:
      - ./vendor

pest_test:
  stage: test
  script:
    - ./vendor/bin/pest

larastan_test:
  stage: test
  script:
    - ./vendor/bin/phpstan analyse --memory-limit=2G --no-progress

build_docker_image:
  stage: deploy_production
  dependencies: []
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $CI_REGISTRY_IMAGE:latest
      -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -f ./.docker/Dockerfile .
    - docker push $CI_REGISTRY_IMAGE --all-tags
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
      when: on_success

deploy_containers:
  stage: deploy_production

  script:
    - scp /path/to/file username@a:/path/to/destination
    - ssh username@IP "docker compose up -d"
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
      when: manual

PHP-FPM容器的自定义Dockerfile配置:

FROM composer:2.7.2 AS composer
WORKDIR /var/www/

COPY . ./

RUN composer install --ignore-platform-reqs --prefer-dist --no-scripts --no-progress --no-interaction --no-dev \
    --no-autoloader

FROM php:8.2.8-fpm

ENV USER=www
ENV GROUP=www
ENV ACCEPT_EULA=Y

# Install dependencies
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    libzip-dev \
    zip \
    unzip \
    gnupg \
    gnupg2 \
    nano

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip

RUN docker-php-ext-enable zip

#DRIVER SQL SRV
RUN apt-get update

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update
RUN ACCEPT_EULA=Y apt-get install -y msodbcsql18
RUN ACCEPT_EULA=Y apt-get install -y mssql-tools18
RUN echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
RUN  apt-get install -y unixodbc-dev
RUN apt-get -y install unixodbc-dev
RUN pecl install sqlsrv pdo_sqlsrv

RUN docker-php-ext-enable sqlsrv pdo_sqlsrv
#DRIVER SQL SRV

# Get the build app
COPY --from=composer /var/www/ /var/www/

# Setup working directory
WORKDIR /var/www/

# Create User and Group
RUN groupadd -g 1000 ${GROUP} && useradd -u 1000 -ms /bin/bash -g ${GROUP} ${USER}

# Grant Permissions
RUN chown -R ${USER} /var/www

EXPOSE 9000

CMD ["php-fpm"]

目前gitlab-ci.yml尚未完善,还需处理.env文件、版本发布等内容,想请教当前流程是否正确,有无更优实践方案?


当前流程合理性判断

你的基础流程框架是可行的:依赖构建→测试→镜像构建→手动部署的链路符合Laravel项目CI/CD的常规逻辑,尤其是将测试阶段前置、生产部署设为手动触发的设计,能有效避免错误代码直接上线。

优化实践方案

1. SSH部署的安全与效率优化

  • 避免硬编码与明文传输:将部署目标信息(主机IP、用户名)存入GitLab项目的CI/CD变量;配置Runner与部署宿主机的免密SSH登录(在Runner生成密钥对,将公钥添加到部署宿主机~/.ssh/authorized_keys),替代密码登录。
  • 更新镜像再启动容器:部署时先拉取最新镜像,避免宿主机使用旧版本:
    ssh username@$DEPLOY_HOST "cd /path/to/compose && docker compose pull && docker compose up -d"
    
  • 清理无效资源:部署后添加命令清理未使用的镜像、容器,节省宿主机资源:
    ssh username@$DEPLOY_HOST "docker system prune -f"
    

2. .env文件处理

  • 配置与代码分离:不要将.env打包进镜像,通过GitLab CI/CD变量存储生产配置,部署时写入宿主机的.env.production文件,在docker-compose.yml中引用:
    services:
      php-fpm:
        image: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
        env_file:
          - .env.production
    

3. 版本发布与镜像管理

  • 规范化镜像标签:添加$CI_COMMIT_TAG标签用于正式版本发布,配合Git标签实现版本回溯:
    script:
      - docker build -t $CI_REGISTRY_IMAGE:latest
        -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
        -t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG -f ./.docker/Dockerfile .
      - docker push $CI_REGISTRY_IMAGE --all-tags
    rules:
      - if: $CI_COMMIT_BRANCH == "main"
      - if: $CI_COMMIT_TAG
    
  • 设置镜像过期规则:在GitLab容器注册表中配置自动清理策略(如保留最近30个镜像、删除30天未使用的镜像),避免存储空间溢出。

4. Dockerfile优化

  • 合并冗余命令:将重复的apt-get install命令合并,减少镜像层数:
    #DRIVER SQL SRV
    RUN apt-get update && \
        curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
        curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list && \
        apt-get update && \
        ACCEPT_EULA=Y apt-get install -y msodbcsql18 mssql-tools18 unixodbc-dev && \
        echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc && \
        pecl install sqlsrv pdo_sqlsrv && \
        docker-php-ext-enable sqlsrv pdo_sqlsrv && \
        apt-get clean && rm -rf /var/lib/apt/lists/*
    
  • 补全composer自动加载:在composer阶段添加自动加载生成命令:
    RUN composer install --ignore-platform-reqs --prefer-dist --no-scripts --no-progress --no-interaction --no-dev \
        --no-autoloader && \
        composer dump-autoload --optimize
    
  • 移除不必要依赖:生产环境镜像可删除git、nano等工具,缩小镜像体积。

5. CI阶段优化

  • 并行测试:将单元测试与静态分析并行执行,缩短CI运行时间:
    pest_test:
      stage: test
      script:
        - ./vendor/bin/pest
      parallel: true
    
    larastan_test:
      stage: test
      script:
        - ./vendor/bin/phpstan analyse --memory-limit=2G --no-progress
      parallel: true
    
  • 优化依赖缓存:添加composer.lock作为缓存键,避免缓存失效时重新安装所有依赖:
    cache:
      paths:
        - vendor/
      key:
        files:
          - composer.lock
    
  • 启用镜像构建缓存:利用GitLab Runner的Docker层缓存,减少镜像构建时间:
    build_docker_image:
      stage: deploy_production
      before_script:
        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
      script:
        - docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:latest
          -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -f ./.docker/Dockerfile .
        - docker push $CI_REGISTRY_IMAGE --all-tags
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:14:55